[{"data":1,"prerenderedAt":8403},["ShallowReactive",2],{"blog-posts":3},[4,501,1191,1758,2313,3009,3666,4349,5009,5606,6155,6312,6415,6491,6854,7662,8282,8326],{"id":5,"title":6,"author":7,"body":11,"categories":476,"cta":478,"date":486,"description":17,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":489,"navigation":386,"path":490,"readingTime":491,"seo":492,"stem":494,"tags":495,"__hash__":500},"blog\u002Fblog\u002Fdo-i-really-need-https.md","Do I Really Need HTTPS? What Happens If My Website Is Not Secure",{"name":8,"avatar":9,"description":10},"Perlat Kociaj","\u002Fimages\u002Fperlat.jpeg","Full Stack Web Developer",{"type":12,"value":13,"toc":443},"minimark",[14,18,21,26,29,48,51,54,58,61,64,67,79,81,85,88,95,101,107,112,115,118,120,124,127,130,134,155,159,162,165,168,170,174,177,180,184,206,208,212,215,235,238,242,275,277,281,284,288,291,294,298,301,304,308,329,331,335,338,342,345,349,352,356,359,363,366,369,371,375,425,428,430,434,437,440],[15,16,17],"p",{},"You visit your own website and notice the browser says \"Not Secure\" next to your web address. Or a customer mentions it. Or Google Search Console sends you a warning.",[15,19,20],{},"The short answer is yes, you need HTTPS. Every website does. It is no longer optional, and the consequences of ignoring it are real.",[22,23,25],"h2",{"id":24},"quick-answer","Quick Answer",[15,27,28],{},"HTTPS encrypts the connection between your website and your visitors. Without it:",[30,31,32,36,39,42,45],"ol",{},[33,34,35],"li",{},"Browsers show a visible \"Not Secure\" warning",[33,37,38],{},"Visitors lose trust and may leave immediately",[33,40,41],{},"Google ranks HTTPS sites higher than HTTP sites",[33,43,44],{},"Form submissions and passwords are sent without encryption",[33,46,47],{},"Some features and integrations will not work without HTTPS",[15,49,50],{},"Setting up HTTPS is straightforward and often free. There is no good reason not to have it.",[52,53],"hr",{},[22,55,57],{"id":56},"what-https-actually-means","What HTTPS Actually Means",[15,59,60],{},"HTTP is the protocol your browser uses to load websites. HTTPS is the same thing with encryption added.",[15,62,63],{},"When a visitor loads your site over HTTPS, the data travelling between their browser and your server is encrypted. Nobody sitting between them (on public WiFi, at an internet provider, or anywhere else in the chain) can read or tamper with that data.",[15,65,66],{},"The \"S\" stands for \"secure.\" It is enabled by installing an SSL certificate on your web server.",[15,68,69,70,74,75,78],{},"You can tell whether a site uses HTTPS by looking at the web address. If it starts with ",[71,72,73],"code",{},"https:\u002F\u002F"," and shows a padlock icon, it is secure. If it starts with ",[71,76,77],{},"http:\u002F\u002F"," or the browser shows a warning, it is not.",[52,80],{},[22,82,84],{"id":83},"what-visitors-see-when-your-site-is-not-secure","What Visitors See When Your Site Is Not Secure",[15,86,87],{},"Modern browsers are very clear about insecure websites.",[15,89,90,94],{},[91,92,93],"strong",{},"Chrome"," shows \"Not Secure\" in the address bar on HTTP pages. If the page has a form (like a contact form or login), the warning becomes more prominent.",[15,96,97,100],{},[91,98,99],{},"Safari"," shows a similar warning and may block certain features.",[15,102,103,106],{},[91,104,105],{},"Firefox"," displays a crossed-out padlock and warns users before they submit any form data.",[108,109,111],"h3",{"id":110},"why-this-matters-for-your-business","Why this matters for your business",[15,113,114],{},"Imagine a potential customer visits your website for the first time. Before they read a single word of your content, they see \"Not Secure\" at the top of the screen. Their immediate thought is that your site might not be safe.",[15,116,117],{},"Most people do not understand what HTTPS means technically. But they understand the word \"Not Secure.\" And many will leave.",[52,119],{},[22,121,123],{"id":122},"how-https-affects-trust-and-conversions","How HTTPS Affects Trust and Conversions",[15,125,126],{},"Trust is everything online. Visitors cannot see your office, shake your hand, or look you in the eye. Your website is their entire impression of your business.",[15,128,129],{},"A \"Not Secure\" warning undermines that impression before you have had a chance to make it.",[108,131,133],{"id":132},"the-impact","The impact",[135,136,137,146,149,152],"ul",{},[33,138,139,140,145],{},"Visitors are less likely to fill in a ",[141,142,144],"a",{"href":143},"\u002Fblog\u002Fwhy-does-my-contact-form-stop-working","contact form"," on an insecure site",[33,147,148],{},"Customers will not enter payment details without HTTPS (and payment processors require it)",[33,150,151],{},"Business partners and suppliers may question your professionalism",[33,153,154],{},"If you collect any personal data without HTTPS, you may be violating privacy regulations",[108,156,158],{"id":157},"the-my-site-does-not-collect-data-misconception","The \"my site does not collect data\" misconception",[15,160,161],{},"Some business owners think HTTPS only matters for ecommerce sites or login pages. This is wrong.",[15,163,164],{},"Even a simple brochure site with a contact form collects names, email addresses, and phone numbers. Without HTTPS, that information is sent in plain text. But beyond data collection, the browser warning alone is enough to cost you visitors.",[15,166,167],{},"Every website needs HTTPS. There are no exceptions worth making.",[52,169],{},[22,171,173],{"id":172},"how-google-treats-http-vs-https","How Google Treats HTTP vs HTTPS",[15,175,176],{},"Google has used HTTPS as a ranking signal since 2014. Sites with HTTPS get a small ranking advantage over identical sites without it.",[15,178,179],{},"More importantly, Google Chrome is the most popular browser in the world. When Chrome flags your site as \"Not Secure,\" that affects how the majority of your visitors experience your website.",[108,181,183],{"id":182},"seo-impact","SEO impact",[135,185,186,189,192,195,198],{},[33,187,188],{},"HTTPS is a confirmed Google ranking factor",[33,190,191],{},"Google Search Console flags HTTP issues and mixed content warnings",[33,193,194],{},"Pages with security warnings have higher bounce rates, which indirectly affects rankings",[33,196,197],{},"Google prefers to index and display HTTPS versions of pages",[33,199,200,201,205],{},"If your site is ",[141,202,204],{"href":203},"\u002Fblog\u002Fwhy-does-google-not-show-my-business-website","not showing up on Google",", an insecure connection could be one contributing factor",[52,207],{},[22,209,211],{"id":210},"how-to-check-if-your-site-has-https","How To Check If Your Site Has HTTPS",[15,213,214],{},"This takes about ten seconds:",[30,216,217,220,223,229],{},[33,218,219],{},"Open your website in a browser",[33,221,222],{},"Look at the address bar",[33,224,225,226,228],{},"If you see a padlock icon and the URL starts with ",[71,227,73],{},", you are fine",[33,230,231,232,234],{},"If you see \"Not Secure\" or the URL starts with ",[71,233,77],{},", you need to act",[15,236,237],{},"You can also check using online tools. Enter your domain into an SSL checker and it will tell you whether your certificate is installed, valid, and not expired.",[108,239,241],{"id":240},"common-issues-to-look-for","Common issues to look for",[135,243,244,250,256,262],{},[33,245,246,249],{},[91,247,248],{},"No SSL certificate at all."," The site loads over HTTP only.",[33,251,252,255],{},[91,253,254],{},"Expired certificate."," The certificate was installed but was not renewed. Browsers will show a full-page warning.",[33,257,258,261],{},[91,259,260],{},"Mixed content."," The page loads over HTTPS but some images, scripts, or stylesheets still load over HTTP. This can trigger warnings.",[33,263,264,267,268,271,272,274],{},[91,265,266],{},"Wrong certificate."," The certificate is for a different domain or does not cover ",[71,269,270],{},"www"," and non-",[71,273,270],{}," versions.",[52,276],{},[22,278,280],{"id":279},"how-to-get-an-ssl-certificate","How To Get an SSL Certificate",[15,282,283],{},"There are two main options:",[108,285,287],{"id":286},"free-ssl-lets-encrypt","Free SSL (Let's Encrypt)",[15,289,290],{},"Most modern hosting providers include free SSL certificates through Let's Encrypt. These certificates are legitimate, trusted by all browsers, and renew automatically.",[15,292,293],{},"If your host offers free SSL, there is no reason not to enable it. It is usually a single click in your hosting control panel.",[108,295,297],{"id":296},"paid-ssl","Paid SSL",[15,299,300],{},"Paid certificates offer additional features like extended validation (showing your company name in the address bar), warranty coverage, and wildcard certificates that cover all subdomains.",[15,302,303],{},"For most small business websites, a free Let's Encrypt certificate is perfectly adequate.",[108,305,307],{"id":306},"what-to-do","What to do",[135,309,310,313,316,319],{},[33,311,312],{},"Check your hosting control panel for a free SSL option",[33,314,315],{},"If it is available, enable it",[33,317,318],{},"If not, ask your hosting provider or developer to install one",[33,320,321,322,325,326],{},"Make sure the certificate covers both ",[71,323,324],{},"yourdomain.com"," and ",[71,327,328],{},"www.yourdomain.com",[52,330],{},[22,332,334],{"id":333},"common-problems-after-switching-to-https","Common Problems After Switching to HTTPS",[15,336,337],{},"Switching from HTTP to HTTPS is usually smooth, but a few things can go wrong:",[108,339,341],{"id":340},"mixed-content-warnings","Mixed content warnings",[15,343,344],{},"Your pages load over HTTPS but some images, stylesheets, or scripts still reference HTTP URLs. This needs to be fixed by updating those references.",[108,346,348],{"id":347},"broken-redirects","Broken redirects",[15,350,351],{},"Visitors who type your old HTTP address or follow old links need to be automatically redirected to the HTTPS version. Without proper redirects, you could have two versions of your site competing with each other.",[108,353,355],{"id":354},"search-engine-confusion","Search engine confusion",[15,357,358],{},"If Google has indexed your HTTP pages, you need to tell it that the HTTPS versions are the correct ones. This is done through redirects and updating your sitemap in Google Search Console.",[108,360,362],{"id":361},"certificate-renewal-failures","Certificate renewal failures",[15,364,365],{},"SSL certificates expire and need to be renewed. Free certificates from Let's Encrypt renew automatically, but if the renewal process fails, your site will show a full-page security warning until it is fixed.",[15,367,368],{},"A developer can handle all of these during the migration. If you are doing it yourself, your hosting provider's support team can usually help.",[52,370],{},[22,372,374],{"id":373},"a-quick-https-checklist","A Quick HTTPS Checklist",[135,376,379,389,395,401,407,413,419],{"className":377},[378],"contains-task-list",[33,380,383,388],{"className":381},[382],"task-list-item",[384,385],"input",{"disabled":386,"type":387},true,"checkbox"," Does your site load over HTTPS?",[33,390,392,394],{"className":391},[382],[384,393],{"disabled":386,"type":387}," Is the padlock icon visible in the address bar?",[33,396,398,400],{"className":397},[382],[384,399],{"disabled":386,"type":387}," Does HTTP automatically redirect to HTTPS?",[33,402,404,406],{"className":403},[382],[384,405],{"disabled":386,"type":387}," Are there any mixed content warnings?",[33,408,410,412],{"className":409},[382],[384,411],{"disabled":386,"type":387}," Does the certificate cover both www and non-www?",[33,414,416,418],{"className":415},[382],[384,417],{"disabled":386,"type":387}," Is the certificate set to renew automatically?",[33,420,422,424],{"className":421},[382],[384,423],{"disabled":386,"type":387}," Have you updated your sitemap and Google Search Console?",[15,426,427],{},"If any of those are a \"no,\" you have a specific thing to fix.",[52,429],{},[22,431,433],{"id":432},"final-thought","Final Thought",[15,435,436],{},"HTTPS is not an advanced security feature. It is a basic requirement for any website in 2026.",[15,438,439],{},"The cost is usually free. The setup is straightforward. The consequences of not having it — lost trust, lower rankings, browser warnings, and potential privacy issues — are not worth the risk.",[15,441,442],{},"If your website is still on HTTP, make it the next thing you fix.",{"title":444,"searchDepth":445,"depth":445,"links":446},"",2,[447,448,449,453,457,460,463,468,474,475],{"id":24,"depth":445,"text":25},{"id":56,"depth":445,"text":57},{"id":83,"depth":445,"text":84,"children":450},[451],{"id":110,"depth":452,"text":111},3,{"id":122,"depth":445,"text":123,"children":454},[455,456],{"id":132,"depth":452,"text":133},{"id":157,"depth":452,"text":158},{"id":172,"depth":445,"text":173,"children":458},[459],{"id":182,"depth":452,"text":183},{"id":210,"depth":445,"text":211,"children":461},[462],{"id":240,"depth":452,"text":241},{"id":279,"depth":445,"text":280,"children":464},[465,466,467],{"id":286,"depth":452,"text":287},{"id":296,"depth":452,"text":297},{"id":306,"depth":452,"text":307},{"id":333,"depth":445,"text":334,"children":469},[470,471,472,473],{"id":340,"depth":452,"text":341},{"id":347,"depth":452,"text":348},{"id":354,"depth":452,"text":355},{"id":361,"depth":452,"text":362},{"id":373,"depth":445,"text":374},{"id":432,"depth":445,"text":433},[477],"Article",{"title":479,"titleAccent":480,"description":481,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":484,"secondaryButtonLink":485},"Is your website showing a 'Not Secure' warning?","Let's fix that.","If your website is still on HTTP or your SSL certificate has expired, I can set it up properly so visitors and search engines trust your site.","Get in touch","\u002Fcontact","View maintenance services","\u002Fservices\u002Fwebsite-maintenance","2026-05-05",null,"md",{},"\u002Fblog\u002Fdo-i-really-need-https",5,{"title":6,"description":493,"ogImage":444},"A simple guide explaining HTTPS, SSL certificates, and why every business website needs them. Covers browser warnings, SEO impact, trust, and how to set it up.","blog\u002Fdo-i-really-need-https",[496,497,498,499],"HTTPS","SSL","security","small business","xpVWV95zIqdSP4w2WCJyrxwgiVYGEgdJ6jEf8IMaTNk",{"id":502,"title":503,"author":504,"body":505,"categories":1174,"cta":1175,"date":486,"description":509,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":1180,"navigation":386,"path":1181,"readingTime":1182,"seo":1183,"stem":1185,"tags":1186,"__hash__":1190},"blog\u002Fblog\u002Fhow-much-should-a-business-website-cost.md","How Much Should a Business Website Cost? What You Are Actually Paying For",{"name":8,"avatar":9,"description":10},{"type":12,"value":506,"toc":1138},[507,510,513,516,518,521,547,550,552,556,559,562,577,580,582,586,589,593,616,620,637,641,655,657,661,669,672,701,704,727,730,744,746,750,753,757,774,778,795,799,821,824,826,830,833,837,840,844,852,856,862,866,872,876,884,888,891,893,897,900,942,944,948,951,983,985,989,992,996,1022,1026,1043,1047,1071,1073,1077,1080,1122,1125,1127,1129,1132,1135],[15,508,509],{},"You need a website for your business. You ask three developers for a quote and get three wildly different numbers. One says a few hundred. Another says several thousand. A third comes back with a figure that makes you question whether you are building a website or buying a house.",[15,511,512],{},"Website pricing is confusing because there is no standard product. A \"website\" can mean anything from a single-page template to a fully custom web application. The price depends entirely on what you need, who builds it, and how it is built.",[15,514,515],{},"Here is what actually drives the cost so you can make informed decisions.",[22,517,25],{"id":24},[15,519,520],{},"Typical price ranges for business websites:",[135,522,523,529,535,541],{},[33,524,525,528],{},[91,526,527],{},"Template-based brochure site"," (5–10 pages): lower end of the market",[33,530,531,534],{},[91,532,533],{},"Custom-designed brochure site"," (5–15 pages): mid range",[33,536,537,540],{},[91,538,539],{},"Ecommerce store"," (custom design, product management): mid to upper range",[33,542,543,546],{},[91,544,545],{},"Custom web application"," (bespoke functionality, integrations): upper range",[15,548,549],{},"The price depends on design complexity, functionality requirements, content volume, and who builds it. Ongoing costs (hosting, maintenance, domain) add to the total.",[52,551],{},[22,553,555],{"id":554},"why-there-is-no-single-answer","Why There Is No Single Answer",[15,557,558],{},"Asking \"how much does a website cost?\" is like asking \"how much does a building cost?\" A garden shed and a restaurant are both buildings, but the price difference is enormous.",[15,560,561],{},"Websites vary just as widely:",[135,563,564,567,570],{},[33,565,566],{},"A five-page site with a template and stock photos is a different product from a fifteen-page site with custom design, animations, and a booking system",[33,568,569],{},"A freelancer working from home has different overheads from an agency with a team of designers and developers",[33,571,572,573],{},"A site built on a page builder requires different skills than one ",[141,574,576],{"href":575},"\u002Fservices\u002Fweb-development","built with custom code",[15,578,579],{},"Understanding what you are paying for is more useful than fixating on a specific number.",[52,581],{},[22,583,585],{"id":584},"what-a-basic-brochure-site-includes","What a Basic Brochure Site Includes",[15,587,588],{},"A brochure site is the digital equivalent of a business card or leaflet. It tells visitors who you are, what you do, and how to contact you.",[108,590,592],{"id":591},"typically-includes","Typically includes",[135,594,595,598,601,604,607,610,613],{},[33,596,597],{},"Homepage with key messaging",[33,599,600],{},"About page",[33,602,603],{},"Services or product overview",[33,605,606],{},"Contact page with a working form",[33,608,609],{},"Basic SEO setup (page titles, meta descriptions)",[33,611,612],{},"Mobile-responsive design",[33,614,615],{},"Hosting and domain setup",[108,617,619],{"id":618},"what-drives-the-price-up","What drives the price up",[135,621,622,625,628,631,634],{},[33,623,624],{},"Custom design vs using a pre-made template",[33,626,627],{},"Number of pages",[33,629,630],{},"Quality and quantity of photography",[33,632,633],{},"Copywriting (if the developer writes the content for you)",[33,635,636],{},"Integration with third-party tools (booking systems, CRMs)",[108,638,640],{"id":639},"what-drives-the-price-down","What drives the price down",[135,642,643,646,649,652],{},[33,644,645],{},"Using a template or theme",[33,647,648],{},"Providing your own content and images",[33,650,651],{},"Fewer pages and simpler functionality",[33,653,654],{},"Using a website builder platform",[52,656],{},[22,658,660],{"id":659},"what-an-ecommerce-site-includes","What an Ecommerce Site Includes",[15,662,663,664,668],{},"An ",[141,665,667],{"href":666},"\u002Fservices\u002Fecommerce-solutions","ecommerce website"," is significantly more complex than a brochure site because it needs to handle products, payments, shipping, and customer accounts.",[108,670,592],{"id":671},"typically-includes-1",[135,673,674,677,680,683,686,689,692,695,698],{},[33,675,676],{},"Everything in a brochure site",[33,678,679],{},"Product catalogue with categories and search",[33,681,682],{},"Shopping cart and checkout flow",[33,684,685],{},"Payment gateway integration",[33,687,688],{},"Order management",[33,690,691],{},"Customer accounts (optional)",[33,693,694],{},"Inventory tracking",[33,696,697],{},"Shipping and tax configuration",[33,699,700],{},"SSL and security setup",[108,702,619],{"id":703},"what-drives-the-price-up-1",[135,705,706,709,712,715,718,721,724],{},[33,707,708],{},"Number of products and product variations",[33,710,711],{},"Custom product pages or configurators",[33,713,714],{},"Multiple payment methods",[33,716,717],{},"Complex shipping rules",[33,719,720],{},"Integration with accounting or ERP systems",[33,722,723],{},"Subscription or recurring payment features",[33,725,726],{},"Multi-currency or multi-language support",[108,728,640],{"id":729},"what-drives-the-price-down-1",[135,731,732,735,738,741],{},[33,733,734],{},"Using an established platform (Shopify, WooCommerce)",[33,736,737],{},"Standard product types without complex variations",[33,739,740],{},"Using the platform's built-in checkout and payments",[33,742,743],{},"Smaller product catalogue",[52,745],{},[22,747,749],{"id":748},"custom-development-vs-templates-vs-page-builders","Custom Development vs Templates vs Page Builders",[15,751,752],{},"The method used to build your site has a significant impact on both the initial cost and the long-term experience.",[108,754,756],{"id":755},"page-builders-squarespace-wix-etc","Page builders (Squarespace, Wix, etc.)",[135,758,759,762,765,768,771],{},[33,760,761],{},"Lowest initial cost",[33,763,764],{},"Limited customisation",[33,766,767],{},"Ongoing monthly platform fees",[33,769,770],{},"You can often manage content yourself",[33,772,773],{},"Performance and flexibility are constrained by the platform",[108,775,777],{"id":776},"template-based-builds-wordpress-with-a-theme-shopify-with-a-template","Template-based builds (WordPress with a theme, Shopify with a template)",[135,779,780,783,786,789,792],{},[33,781,782],{},"Moderate initial cost",[33,784,785],{},"More flexibility than page builders",[33,787,788],{},"Can be customised to a degree",[33,790,791],{},"May require a developer for changes beyond the basics",[33,793,794],{},"Quality depends heavily on the theme chosen",[108,796,798],{"id":797},"custom-development","Custom development",[135,800,801,804,807,815,818],{},[33,802,803],{},"Highest initial cost",[33,805,806],{},"Built specifically for your needs",[33,808,809,810,814],{},"Best ",[141,811,813],{"href":812},"\u002Fservices\u002Fperformance-optimization","performance"," and flexibility",[33,816,817],{},"Easier to scale and adapt over time",[33,819,820],{},"Requires a developer for structural changes",[15,822,823],{},"None of these is inherently better. The right choice depends on your budget, your needs, and how much the website matters to your business.",[52,825],{},[22,827,829],{"id":828},"ongoing-costs-people-forget","Ongoing Costs People Forget",[15,831,832],{},"The price of building a website is not the total cost. There are recurring costs that many business owners do not account for.",[108,834,836],{"id":835},"domain-name","Domain name",[15,838,839],{},"Your web address (e.g., yourbusiness.com) needs to be renewed annually. This is usually a small cost, but letting it expire can be a serious problem.",[108,841,843],{"id":842},"hosting","Hosting",[15,845,846,847,851],{},"Your website needs a server to run on. Hosting quality affects ",[141,848,850],{"href":849},"\u002Fblog\u002Fwhy-is-my-website-slow-7-simple-things-that-usually-cause-it","speed",", reliability, and security. Cheap hosting saves money upfront but can cost you in performance and downtime.",[108,853,855],{"id":854},"ssl-certificate","SSL certificate",[15,857,858,859,861],{},"Required for ",[141,860,496],{"href":490}," and the secure padlock in browsers. Many hosts include this for free, but some charge separately.",[108,863,865],{"id":864},"maintenance","Maintenance",[15,867,868,869,871],{},"Software updates, security patches, backups, and monitoring. Ignoring ",[141,870,864],{"href":485}," leads to security vulnerabilities, broken features, and higher recovery costs later.",[108,873,875],{"id":874},"email","Email",[15,877,878,879,883],{},"Business email (",[141,880,882],{"href":881},"mailto:you@yourdomain.com","you@yourdomain.com",") is usually a separate cost from your website. Google Workspace and Microsoft 365 are the most common options.",[108,885,887],{"id":886},"content-updates","Content updates",[15,889,890],{},"If you need a developer to update your site's content, that is an ongoing cost. If the site is built so you can update content yourself, this cost drops significantly.",[52,892],{},[22,894,896],{"id":895},"red-flags-in-cheap-quotes","Red Flags in Cheap Quotes",[15,898,899],{},"A very low price is not always a bargain. Watch out for:",[135,901,902,908,918,924,930,936],{},[33,903,904,907],{},[91,905,906],{},"No mention of mobile responsiveness."," If the quote does not mention mobile, the site might not work properly on phones.",[33,909,910,913,914,917],{},[91,911,912],{},"No SEO setup."," Basic SEO (page titles, meta descriptions, sitemap) should be included. If it is not, your site may be ",[141,915,916],{"href":203},"invisible to Google",".",[33,919,920,923],{},[91,921,922],{},"No mention of security."," SSL, updates, and basic security measures are not optional extras.",[33,925,926,929],{},[91,927,928],{},"Template with no customisation."," If the price is very low, you might be getting an off-the-shelf template with your logo swapped in and nothing else.",[33,931,932,935],{},[91,933,934],{},"No ongoing support."," What happens when something breaks? If the quote covers only the build and nothing after, you may be on your own.",[33,937,938,941],{},[91,939,940],{},"Ownership unclear."," Make sure you own the domain, the hosting account, and the website files. Some cheap providers retain ownership.",[52,943],{},[22,945,947],{"id":946},"red-flags-in-expensive-quotes","Red Flags in Expensive Quotes",[15,949,950],{},"A high price does not guarantee quality either. Watch out for:",[135,952,953,959,965,971,977],{},[33,954,955,958],{},[91,956,957],{},"Vague deliverables."," If the quote does not specify exactly what you are getting, the scope can drift and the final product may not match expectations.",[33,960,961,964],{},[91,962,963],{},"Unnecessary complexity."," Not every business needs a custom-built CMS, advanced animations, or a bespoke design system. Make sure the complexity matches your actual needs.",[33,966,967,970],{},[91,968,969],{},"Agency overhead."," Larger agencies have higher overheads (office space, account managers, project managers). You may be paying for structure you do not need.",[33,972,973,976],{},[91,974,975],{},"Long timelines with no justification."," If a simple site is quoted at several months, ask why. Longer timelines mean higher costs.",[33,978,979,982],{},[91,980,981],{},"Technology lock-in."," Some agencies use proprietary tools that make it difficult to leave. Make sure you can take your website elsewhere if needed.",[52,984],{},[22,986,988],{"id":987},"how-to-compare-quotes-fairly","How To Compare Quotes Fairly",[15,990,991],{},"When you receive multiple quotes, compare them on equal terms:",[108,993,995],{"id":994},"check-what-is-included","Check what is included",[135,997,998,1001,1004,1007,1010,1013,1016,1019],{},[33,999,1000],{},"How many pages?",[33,1002,1003],{},"Custom design or template?",[33,1005,1006],{},"Mobile responsive?",[33,1008,1009],{},"SEO setup?",[33,1011,1012],{},"Contact form?",[33,1014,1015],{},"Content management (can you edit it yourself)?",[33,1017,1018],{},"Hosting and domain setup?",[33,1020,1021],{},"Post-launch support?",[108,1023,1025],{"id":1024},"check-what-is-not-included","Check what is not included",[135,1027,1028,1031,1034,1037,1040],{},[33,1029,1030],{},"Content writing?",[33,1032,1033],{},"Photography or image sourcing?",[33,1035,1036],{},"Ongoing maintenance?",[33,1038,1039],{},"Future changes or additions?",[33,1041,1042],{},"Training on how to use the site?",[108,1044,1046],{"id":1045},"ask-these-questions","Ask these questions",[135,1048,1049,1052,1055,1058,1061,1068],{},[33,1050,1051],{},"Who owns the domain and hosting account?",[33,1053,1054],{},"What platform or technology is used?",[33,1056,1057],{},"Can I move the site to another developer later?",[33,1059,1060],{},"What happens if I need changes after launch?",[33,1062,1063,1064,1067],{},"Is there a ",[141,1065,1066],{"href":485},"maintenance plan"," available?",[33,1069,1070],{},"How long is the warranty or support period?",[52,1072],{},[22,1074,1076],{"id":1075},"what-to-prioritise-on-a-tight-budget","What To Prioritise on a Tight Budget",[15,1078,1079],{},"If your budget is limited, focus on what matters most:",[30,1081,1082,1088,1094,1104,1110,1116],{},[33,1083,1084,1087],{},[91,1085,1086],{},"Mobile-friendly design."," More than half your visitors will be on phones.",[33,1089,1090,1093],{},[91,1091,1092],{},"Clear, honest content."," Good copywriting is more important than fancy design.",[33,1095,1096,1099,1100,1103],{},[91,1097,1098],{},"Working contact form."," If people cannot ",[141,1101,1102],{"href":143},"reach you",", the site is not doing its job.",[33,1105,1106,1109],{},[91,1107,1108],{},"Basic SEO."," Page titles, meta descriptions, and a sitemap so Google can find you.",[33,1111,1112,1115],{},[91,1113,1114],{},"HTTPS."," Non-negotiable for trust and search rankings.",[33,1117,1118,1121],{},[91,1119,1120],{},"Fast loading speed."," A simple, fast site beats a slow, complex one every time.",[15,1123,1124],{},"You can always add features later. Start with a solid foundation.",[52,1126],{},[22,1128,433],{"id":432},[15,1130,1131],{},"The cost of a business website is not just the build price. It is the build plus hosting, maintenance, content, and the value it brings to your business over time.",[15,1133,1134],{},"A cheap website that does not work properly, does not appear on Google, and does not convert visitors is not a saving. An appropriately priced website that brings in leads, supports your brand, and runs reliably is an investment.",[15,1136,1137],{},"Focus on what you need, understand what you are paying for, and choose someone who can explain both clearly.",{"title":444,"searchDepth":445,"depth":445,"links":1139},[1140,1141,1142,1147,1152,1157,1165,1166,1167,1172,1173],{"id":24,"depth":445,"text":25},{"id":554,"depth":445,"text":555},{"id":584,"depth":445,"text":585,"children":1143},[1144,1145,1146],{"id":591,"depth":452,"text":592},{"id":618,"depth":452,"text":619},{"id":639,"depth":452,"text":640},{"id":659,"depth":445,"text":660,"children":1148},[1149,1150,1151],{"id":671,"depth":452,"text":592},{"id":703,"depth":452,"text":619},{"id":729,"depth":452,"text":640},{"id":748,"depth":445,"text":749,"children":1153},[1154,1155,1156],{"id":755,"depth":452,"text":756},{"id":776,"depth":452,"text":777},{"id":797,"depth":452,"text":798},{"id":828,"depth":445,"text":829,"children":1158},[1159,1160,1161,1162,1163,1164],{"id":835,"depth":452,"text":836},{"id":842,"depth":452,"text":843},{"id":854,"depth":452,"text":855},{"id":864,"depth":452,"text":865},{"id":874,"depth":452,"text":875},{"id":886,"depth":452,"text":887},{"id":895,"depth":445,"text":896},{"id":946,"depth":445,"text":947},{"id":987,"depth":445,"text":988,"children":1168},[1169,1170,1171],{"id":994,"depth":452,"text":995},{"id":1024,"depth":452,"text":1025},{"id":1045,"depth":452,"text":1046},{"id":1075,"depth":445,"text":1076},{"id":432,"depth":445,"text":433},[477],{"title":1176,"titleAccent":1177,"description":1178,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":1179,"secondaryButtonLink":575},"Planning a new website or rebuild?","Let's talk numbers.","If you want an honest conversation about what your website should cost and what you will actually get, I am happy to walk you through it with no obligations.","View web development services",{},"\u002Fblog\u002Fhow-much-should-a-business-website-cost",7,{"title":503,"description":1184,"ogImage":444},"A plain-English breakdown of website costs for business owners. Covers brochure sites, ecommerce, custom builds, ongoing costs, and how to compare developer quotes.","blog\u002Fhow-much-should-a-business-website-cost",[1187,1188,499,1189],"web development","pricing","budgeting","6bYd9l3bUUqgFGTOUkplTkqKgBaN06LCbah_2YkZ56o",{"id":1192,"title":1193,"author":1194,"body":1195,"categories":1742,"cta":1743,"date":486,"description":1199,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":1748,"navigation":386,"path":1749,"readingTime":1750,"seo":1751,"stem":1753,"tags":1754,"__hash__":1757},"blog\u002Fblog\u002Fhow-often-should-i-update-my-website.md","How Often Should I Update My Website? A Realistic Guide for Business Owners",{"name":8,"avatar":9,"description":10},{"type":12,"value":1196,"toc":1709},[1197,1200,1203,1206,1208,1211,1230,1233,1235,1239,1242,1247,1252,1258,1261,1263,1267,1270,1273,1277,1294,1298,1316,1320,1334,1341,1343,1347,1350,1353,1357,1377,1380,1397,1400,1414,1416,1420,1423,1426,1430,1452,1455,1469,1472,1486,1488,1492,1495,1498,1515,1518,1522,1558,1560,1564,1567,1571,1579,1583,1601,1605,1619,1623,1637,1639,1643,1646,1650,1667,1671,1693,1696,1698,1700,1703,1706],[15,1198,1199],{},"You launched your website, it looked great, and then you moved on to running your business. Months or years later, you wonder whether anything needs updating. Or maybe you have been ignoring update notifications and hoping nothing breaks.",[15,1201,1202],{},"This is normal. Most business owners do not think about their website until something goes wrong. But the longer you leave it, the bigger the problems become.",[15,1204,1205],{},"Here is what actually needs updating, how often, and what happens if you do not.",[22,1207,25],{"id":24},[15,1209,1210],{},"There are three types of website updates, and each has a different schedule:",[30,1212,1213,1219,1224],{},[33,1214,1215,1218],{},[91,1216,1217],{},"Software updates"," (plugins, themes, CMS) — monthly",[33,1220,1221,1223],{},[91,1222,887],{}," (text, images, offers) — quarterly or as needed",[33,1225,1226,1229],{},[91,1227,1228],{},"Design and structure updates"," — every two to four years",[15,1231,1232],{},"Ignoring all three leads to security vulnerabilities, broken features, outdated information, and a website that slowly stops serving your business.",[52,1234],{},[22,1236,1238],{"id":1237},"what-updating-actually-means","What \"Updating\" Actually Means",[15,1240,1241],{},"When people say \"update your website,\" they usually mean one of three very different things.",[15,1243,1244,1246],{},[91,1245,1217],{}," are changes to the code that runs your website. If you use WordPress, Shopify, or any CMS, the platform itself and any plugins or themes you use release updates regularly. These fix bugs, patch security holes, and add compatibility with new technologies.",[15,1248,1249,1251],{},[91,1250,887],{}," are changes to what your website says. New services, updated pricing, fresh blog posts, changed opening hours, new team members, or removed products.",[15,1253,1254,1257],{},[91,1255,1256],{},"Design updates"," are changes to how your website looks and functions. Layouts, navigation, branding, user experience, and mobile responsiveness all evolve over time.",[15,1259,1260],{},"Each one matters, but for different reasons and on different timelines.",[52,1262],{},[22,1264,1266],{"id":1265},"software-updates-monthly","Software Updates: Monthly",[15,1268,1269],{},"This is the most important and most neglected type of maintenance.",[15,1271,1272],{},"Your website runs on software. That software has vulnerabilities that are discovered over time. Updates patch those vulnerabilities. If you do not apply them, your site becomes an increasingly easy target.",[108,1274,1276],{"id":1275},"what-needs-updating","What needs updating",[135,1278,1279,1282,1285,1288,1291],{},[33,1280,1281],{},"Your CMS (WordPress, Joomla, Drupal, etc.)",[33,1283,1284],{},"Plugins and extensions",[33,1286,1287],{},"Your theme or template",[33,1289,1290],{},"PHP or server-side software",[33,1292,1293],{},"SSL certificates",[108,1295,1297],{"id":1296},"what-happens-if-you-ignore-it","What happens if you ignore it",[135,1299,1300,1307,1310,1313],{},[33,1301,1302,1306],{},[141,1303,1305],{"href":1304},"\u002Fblog\u002Fwhy-did-my-website-get-hacked","Security vulnerabilities go unpatched",", leaving your site exposed",[33,1308,1309],{},"Plugins break because they are incompatible with newer server software",[33,1311,1312],{},"Features stop working after hosting providers update their systems",[33,1314,1315],{},"Recovery becomes expensive because the site has fallen too far behind",[108,1317,1319],{"id":1318},"a-realistic-schedule","A realistic schedule",[135,1321,1322,1325,1328,1331],{},[33,1323,1324],{},"Check for updates at least once a month",[33,1326,1327],{},"Apply security updates immediately when they are available",[33,1329,1330],{},"Test your site after applying updates to catch any conflicts",[33,1332,1333],{},"Keep a backup before every update session",[15,1335,1336,1337,1340],{},"If this sounds like a chore, that is because it is. A proper ",[141,1338,1339],{"href":485},"website maintenance plan"," handles this for you so nothing slips.",[52,1342],{},[22,1344,1346],{"id":1345},"content-updates-quarterly-or-as-needed","Content Updates: Quarterly or As Needed",[15,1348,1349],{},"Your website is often the first impression someone has of your business. If the content is outdated, it undermines trust.",[15,1351,1352],{},"A site that still lists services you no longer offer, shows team members who left two years ago, or displays pricing from 2022 tells visitors you are not paying attention.",[108,1354,1356],{"id":1355},"what-needs-reviewing","What needs reviewing",[135,1358,1359,1362,1365,1368,1371,1374],{},[33,1360,1361],{},"Service descriptions and pricing",[33,1363,1364],{},"Contact information and opening hours",[33,1366,1367],{},"Team or about page details",[33,1369,1370],{},"Portfolio or case studies",[33,1372,1373],{},"Blog posts with outdated advice",[33,1375,1376],{},"Legal pages (privacy policy, terms)",[108,1378,1297],{"id":1379},"what-happens-if-you-ignore-it-1",[135,1381,1382,1385,1388,1391],{},[33,1383,1384],{},"Customers get confused by inaccurate information",[33,1386,1387],{},"You lose credibility when details are clearly outdated",[33,1389,1390],{},"Google sees stale content as a signal that the site is not actively maintained",[33,1392,1393,1394],{},"Old blog posts with broken links or outdated advice can hurt your ",[141,1395,1396],{"href":203},"search visibility",[108,1398,1319],{"id":1399},"a-realistic-schedule-1",[135,1401,1402,1405,1408,1411],{},[33,1403,1404],{},"Review key pages quarterly (services, about, contact)",[33,1406,1407],{},"Update pricing and offers whenever they change",[33,1409,1410],{},"Add new work to your portfolio as it is completed",[33,1412,1413],{},"Refresh or remove blog posts that are no longer accurate",[52,1415],{},[22,1417,1419],{"id":1418},"design-updates-every-two-to-four-years","Design Updates: Every Two to Four Years",[15,1421,1422],{},"Web design trends, user expectations, and technology standards change over time. A website that looked modern in 2021 may feel dated by 2025.",[15,1424,1425],{},"This does not mean you need a redesign every year. But it does mean you should honestly assess whether your website still represents your business well.",[108,1427,1429],{"id":1428},"signs-your-design-needs-attention","Signs your design needs attention",[135,1431,1432,1440,1443,1446,1449],{},[33,1433,1434,1435,1439],{},"The site ",[141,1436,1438],{"href":1437},"\u002Fblog\u002Fwhy-does-my-site-look-broken-on-mobile","looks broken on mobile"," or feels awkward to use on a phone",[33,1441,1442],{},"Your competitors' websites look noticeably more modern",[33,1444,1445],{},"The design does not match your current branding",[33,1447,1448],{},"User experience standards have moved on (dark mode, accessibility, speed expectations)",[33,1450,1451],{},"You are embarrassed to send people to your website",[108,1453,1297],{"id":1454},"what-happens-if-you-ignore-it-2",[135,1456,1457,1460,1463,1466],{},[33,1458,1459],{},"Visitors form a negative first impression",[33,1461,1462],{},"Mobile users have a poor experience",[33,1464,1465],{},"Conversion rates decline as expectations rise",[33,1467,1468],{},"The gap between your brand and your website widens",[108,1470,1319],{"id":1471},"a-realistic-schedule-2",[135,1473,1474,1477,1483],{},[33,1475,1476],{},"Assess your design honestly once a year",[33,1478,1479,1480],{},"Plan a refresh or ",[141,1481,1482],{"href":575},"rebuild every three to four years",[33,1484,1485],{},"Address critical mobile and accessibility issues immediately regardless of the overall design timeline",[52,1487],{},[22,1489,1491],{"id":1490},"the-cost-of-doing-nothing","The Cost of Doing Nothing",[15,1493,1494],{},"Ignoring website maintenance does not save money. It defers costs and usually increases them.",[15,1496,1497],{},"A website that has not been updated in two years might need:",[135,1499,1500,1503,1506,1509,1512],{},[33,1501,1502],{},"dozens of plugin updates applied carefully in sequence",[33,1504,1505],{},"compatibility fixes for outdated themes",[33,1507,1508],{},"security cleanup if the site was compromised",[33,1510,1511],{},"content review and rewriting across multiple pages",[33,1513,1514],{},"potential redesign if the technology is too far behind",[15,1516,1517],{},"Catching up after years of neglect is almost always more expensive than steady, ongoing maintenance.",[108,1519,1521],{"id":1520},"the-hidden-costs","The hidden costs",[135,1523,1524,1534,1540,1546,1552],{},[33,1525,1526,1529,1530,1533],{},[91,1527,1528],{},"Lost leads"," from ",[141,1531,1532],{"href":143},"broken contact forms"," that nobody noticed",[33,1535,1536,1539],{},[91,1537,1538],{},"Lost trust"," from visitors who see outdated content",[33,1541,1542,1545],{},[91,1543,1544],{},"Lost rankings"," as Google deprioritises stale, slow, or insecure sites",[33,1547,1548,1551],{},[91,1549,1550],{},"Recovery costs"," after a security breach that could have been prevented",[33,1553,1554,1557],{},[91,1555,1556],{},"Opportunity costs"," from a website that no longer converts",[52,1559],{},[22,1561,1563],{"id":1562},"a-realistic-maintenance-schedule","A Realistic Maintenance Schedule",[15,1565,1566],{},"Here is a practical schedule that works for most small business websites:",[108,1568,1570],{"id":1569},"weekly","Weekly",[135,1572,1573,1576],{},[33,1574,1575],{},"Check that the site loads and looks correct",[33,1577,1578],{},"Review any form submissions or error alerts",[108,1580,1582],{"id":1581},"monthly","Monthly",[135,1584,1585,1588,1591,1594],{},[33,1586,1587],{},"Apply software updates (CMS, plugins, themes)",[33,1589,1590],{},"Create a backup before and after updates",[33,1592,1593],{},"Check for broken links or error pages",[33,1595,1596,1597,1600],{},"Review ",[141,1598,1599],{"href":849},"website speed"," and performance",[108,1602,1604],{"id":1603},"quarterly","Quarterly",[135,1606,1607,1610,1613,1616],{},[33,1608,1609],{},"Review and update content on key pages",[33,1611,1612],{},"Check contact information and pricing accuracy",[33,1614,1615],{},"Review analytics for unusual drops or patterns",[33,1617,1618],{},"Test forms and booking systems",[108,1620,1622],{"id":1621},"annually","Annually",[135,1624,1625,1628,1631,1634],{},[33,1626,1627],{},"Assess the overall design and user experience",[33,1629,1630],{},"Review SEO performance and search visibility",[33,1632,1633],{},"Check security certificates and hosting",[33,1635,1636],{},"Plan any improvements or refreshes for the coming year",[52,1638],{},[22,1640,1642],{"id":1641},"what-to-handle-yourself-vs-what-needs-a-developer","What To Handle Yourself vs What Needs a Developer",[15,1644,1645],{},"Some maintenance tasks are straightforward for business owners. Others need technical knowledge.",[108,1647,1649],{"id":1648},"you-can-handle","You can handle",[135,1651,1652,1655,1658,1661,1664],{},[33,1653,1654],{},"Updating text content and images",[33,1656,1657],{},"Checking that forms and links work",[33,1659,1660],{},"Reviewing analytics",[33,1662,1663],{},"Posting blog content",[33,1665,1666],{},"Keeping business information current",[108,1668,1670],{"id":1669},"a-developer-should-handle","A developer should handle",[135,1672,1673,1676,1679,1684,1687,1690],{},[33,1674,1675],{},"Applying software and security updates",[33,1677,1678],{},"Fixing compatibility issues after updates",[33,1680,1681],{},[141,1682,1683],{"href":812},"Performance optimisation",[33,1685,1686],{},"Security monitoring and incident response",[33,1688,1689],{},"Server and hosting configuration",[33,1691,1692],{},"Backups and disaster recovery setup",[15,1694,1695],{},"The split depends on your technical comfort level, but the key is making sure someone is responsible for each category.",[52,1697],{},[22,1699,433],{"id":432},[15,1701,1702],{},"Your website is not a set-and-forget project. It is a business tool that needs regular attention to stay effective, secure, and trustworthy.",[15,1704,1705],{},"The good news is that steady maintenance is simple and affordable. It is neglect that gets expensive.",[15,1707,1708],{},"If you are not sure when your site was last updated, that is your answer. It has been too long.",{"title":444,"searchDepth":445,"depth":445,"links":1710},[1711,1712,1713,1718,1723,1728,1731,1737,1741],{"id":24,"depth":445,"text":25},{"id":1237,"depth":445,"text":1238},{"id":1265,"depth":445,"text":1266,"children":1714},[1715,1716,1717],{"id":1275,"depth":452,"text":1276},{"id":1296,"depth":452,"text":1297},{"id":1318,"depth":452,"text":1319},{"id":1345,"depth":445,"text":1346,"children":1719},[1720,1721,1722],{"id":1355,"depth":452,"text":1356},{"id":1379,"depth":452,"text":1297},{"id":1399,"depth":452,"text":1319},{"id":1418,"depth":445,"text":1419,"children":1724},[1725,1726,1727],{"id":1428,"depth":452,"text":1429},{"id":1454,"depth":452,"text":1297},{"id":1471,"depth":452,"text":1319},{"id":1490,"depth":445,"text":1491,"children":1729},[1730],{"id":1520,"depth":452,"text":1521},{"id":1562,"depth":445,"text":1563,"children":1732},[1733,1734,1735,1736],{"id":1569,"depth":452,"text":1570},{"id":1581,"depth":452,"text":1582},{"id":1603,"depth":452,"text":1604},{"id":1621,"depth":452,"text":1622},{"id":1641,"depth":445,"text":1642,"children":1738},[1739,1740],{"id":1648,"depth":452,"text":1649},{"id":1669,"depth":452,"text":1670},{"id":432,"depth":445,"text":433},[477],{"title":1744,"titleAccent":1745,"description":1746,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":1747,"secondaryButtonLink":485},"Not sure if your website is up to date?","Let's check.","If your website has not been maintained in months or years, I can audit what needs attention and set up a realistic maintenance plan so nothing falls through the cracks.","View maintenance plans",{},"\u002Fblog\u002Fhow-often-should-i-update-my-website",6,{"title":1193,"description":1752,"ogImage":444},"A realistic guide for business owners explaining what website updates involve, how often they are needed, and what happens when maintenance is ignored.","blog\u002Fhow-often-should-i-update-my-website",[1755,1756,499,498],"website maintenance","updates","bbhiRMCaYLo_42RWNR789INI-oxfHiBk-2kn6B6RdnY",{"id":1759,"title":1760,"author":1761,"body":1762,"categories":2298,"cta":2299,"date":486,"description":1766,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":2304,"navigation":386,"path":2305,"readingTime":1750,"seo":2306,"stem":2308,"tags":2309,"__hash__":2312},"blog\u002Fblog\u002Fwhat-is-website-hosting-and-does-it-matter.md","What Is Website Hosting and Does It Really Matter? A Non-Technical Guide",{"name":8,"avatar":9,"description":10},{"type":12,"value":1763,"toc":2267},[1764,1767,1770,1772,1775,1778,1799,1802,1804,1808,1811,1814,1817,1820,1822,1826,1829,1833,1836,1842,1852,1858,1862,1865,1870,1875,1883,1887,1890,1895,1900,1905,1909,1912,1917,1922,1927,1929,1933,1939,1943,1946,1950,1953,1957,1960,1964,1975,1977,1981,1984,1988,2005,2009,2029,2032,2034,2038,2041,2045,2068,2072,2095,2097,2101,2104,2137,2139,2143,2146,2196,2198,2202,2205,2208,2212,2229,2233,2250,2252,2254,2261,2264],[15,1765,1766],{},"Someone tells you that your website needs better hosting. Or you are setting up a new site and need to choose a hosting provider. But you are not entirely sure what hosting even is or why it matters.",[15,1768,1769],{},"You are not alone. Hosting is one of those things most business owners pay for without fully understanding. And that lack of understanding often leads to paying too much, too little, or for the wrong thing entirely.",[22,1771,25],{"id":24},[15,1773,1774],{},"Website hosting is the service that keeps your website available on the internet. Your website's files live on a computer called a server, and hosting is the service that runs and maintains that server.",[15,1776,1777],{},"Hosting matters because it directly affects:",[30,1779,1780,1783,1786,1789,1792],{},[33,1781,1782],{},"How fast your website loads",[33,1784,1785],{},"How reliably it stays online",[33,1787,1788],{},"How secure it is",[33,1790,1791],{},"How well it handles traffic",[33,1793,1794,1795],{},"How your ",[141,1796,1798],{"href":1797},"\u002Fblog\u002Fwhy-do-emails-from-my-website-go-to-spam","emails are delivered",[15,1800,1801],{},"Cheap hosting saves money upfront but often costs more in the long run through poor performance, downtime, and security problems.",[52,1803],{},[22,1805,1807],{"id":1806},"what-hosting-actually-is","What Hosting Actually Is",[15,1809,1810],{},"Think of your website as a shop. The hosting is the building that shop is in.",[15,1812,1813],{},"Your website is made up of files — code, images, text, databases. Those files need to live somewhere that is connected to the internet 24 hours a day. A hosting provider gives you space on a server (a specialised computer) where your files are stored and served to anyone who visits your website.",[15,1815,1816],{},"When someone types your web address into their browser, the browser contacts your hosting server, requests your website files, and displays the page. This happens every time anyone visits any page on your site.",[15,1818,1819],{},"The quality of that server — its speed, reliability, location, and configuration — directly affects the experience your visitors have.",[52,1821],{},[22,1823,1825],{"id":1824},"types-of-hosting","Types of Hosting",[15,1827,1828],{},"There are several types, and they suit different needs.",[108,1830,1832],{"id":1831},"shared-hosting","Shared hosting",[15,1834,1835],{},"Your website shares a server with dozens or hundreds of other websites. Everyone shares the same resources (processing power, memory, bandwidth).",[15,1837,1838,1841],{},[91,1839,1840],{},"Pros:"," Cheapest option. Easy to set up. Fine for small, low-traffic sites.",[15,1843,1844,1847,1848,1851],{},[91,1845,1846],{},"Cons:"," Performance is affected by other sites on the same server. Limited resources. Security is shared — if another site is compromised, yours could be affected. ",[141,1849,1850],{"href":1797},"Emails sent from shared servers"," often have delivery problems.",[15,1853,1854,1857],{},[91,1855,1856],{},"Best for:"," Personal websites, very small business sites with low traffic.",[108,1859,1861],{"id":1860},"vps-virtual-private-server","VPS (Virtual Private Server)",[15,1863,1864],{},"Your website gets its own dedicated portion of a server. You share the physical machine but your resources are isolated.",[15,1866,1867,1869],{},[91,1868,1840],{}," Better performance than shared. More control. Resources are guaranteed. Less affected by other users.",[15,1871,1872,1874],{},[91,1873,1846],{}," More expensive than shared. May require more technical knowledge to manage.",[15,1876,1877,1879,1880,917],{},[91,1878,1856],{}," Growing business websites, sites with moderate traffic, ",[141,1881,1882],{"href":666},"ecommerce stores",[108,1884,1886],{"id":1885},"dedicated-hosting","Dedicated hosting",[15,1888,1889],{},"You get an entire physical server to yourself.",[15,1891,1892,1894],{},[91,1893,1840],{}," Maximum performance and control. No resource sharing. Full customisation.",[15,1896,1897,1899],{},[91,1898,1846],{}," Most expensive option. Requires technical management.",[15,1901,1902,1904],{},[91,1903,1856],{}," High-traffic websites, large ecommerce operations, applications with specific server requirements.",[108,1906,1908],{"id":1907},"managed-hosting","Managed hosting",[15,1910,1911],{},"A hosting provider handles the server management for you — updates, security, backups, performance optimisation.",[15,1913,1914,1916],{},[91,1915,1840],{}," Less technical work for you. Better performance and security. Expert support. Automatic backups and updates.",[15,1918,1919,1921],{},[91,1920,1846],{}," More expensive than unmanaged equivalents. Less direct control over server configuration.",[15,1923,1924,1926],{},[91,1925,1856],{}," Business owners who want reliability without managing servers themselves. WordPress-specific managed hosts (like Kinsta or WP Engine) are popular for WordPress sites.",[52,1928],{},[22,1930,1932],{"id":1931},"how-hosting-affects-speed","How Hosting Affects Speed",[15,1934,1935,1936,917],{},"Your hosting is one of the biggest factors in ",[141,1937,1938],{"href":849},"how fast your website loads",[108,1940,1942],{"id":1941},"server-response-time","Server response time",[15,1944,1945],{},"When a visitor requests a page, the server has to process that request and send back the files. A slow server means a slow start to every page load, before images, stylesheets, or scripts even begin to download.",[108,1947,1949],{"id":1948},"server-location","Server location",[15,1951,1952],{},"If your server is in the United States and your visitors are in Europe, the data has to travel further. This adds latency to every request. Good hosting providers offer servers in multiple locations or use content delivery networks (CDNs) to serve files from the nearest location.",[108,1954,1956],{"id":1955},"resource-limits","Resource limits",[15,1958,1959],{},"On cheap shared hosting, your site competes with others for processing power and memory. During peak traffic — or if a neighbouring site is using heavy resources — your site slows down.",[108,1961,1963],{"id":1962},"what-to-check","What to check",[135,1965,1966,1969,1972],{},[33,1967,1968],{},"Run a speed test and look at the \"server response time\" or \"Time to First Byte\" (TTFB)",[33,1970,1971],{},"If your TTFB is consistently above 500 milliseconds, hosting may be a bottleneck",[33,1973,1974],{},"Compare your site's speed at different times of day — inconsistency often points to shared resource problems",[52,1976],{},[22,1978,1980],{"id":1979},"how-hosting-affects-reliability","How Hosting Affects Reliability",[15,1982,1983],{},"Downtime means your website is completely unavailable. Visitors see an error page, and you lose every potential customer who tries to visit.",[108,1985,1987],{"id":1986},"what-causes-downtime","What causes downtime",[135,1989,1990,1993,1996,1999,2002],{},[33,1991,1992],{},"Server hardware failures",[33,1994,1995],{},"Software crashes or misconfigurations",[33,1997,1998],{},"Traffic spikes that overwhelm the server",[33,2000,2001],{},"Maintenance windows",[33,2003,2004],{},"Security incidents",[108,2006,2008],{"id":2007},"what-to-look-for","What to look for",[135,2010,2011,2017,2023],{},[33,2012,2013,2016],{},[91,2014,2015],{},"Uptime guarantee."," Reputable hosts offer 99.9% uptime or higher. That still allows for about 8 hours of downtime per year.",[33,2018,2019,2022],{},[91,2020,2021],{},"Monitoring."," Good hosts monitor their servers and fix problems proactively.",[33,2024,2025,2028],{},[91,2026,2027],{},"Redundancy."," Better hosting setups have backup systems that kick in if the primary server fails.",[15,2030,2031],{},"If your website goes down regularly, or if you only find out because a customer tells you, your hosting is not good enough.",[52,2033],{},[22,2035,2037],{"id":2036},"how-hosting-affects-security","How Hosting Affects Security",[15,2039,2040],{},"Your hosting environment is a key part of your website's security. A poorly secured server puts your site at risk regardless of how well the website itself is built.",[108,2042,2044],{"id":2043},"common-hosting-security-issues","Common hosting security issues",[135,2046,2047,2053,2056,2059,2062],{},[33,2048,2049,2050],{},"Outdated server software with ",[141,2051,2052],{"href":1304},"known vulnerabilities",[33,2054,2055],{},"No firewall or intrusion detection",[33,2057,2058],{},"Shared environments where one compromised site can affect others",[33,2060,2061],{},"No automatic backups or backup verification",[33,2063,2064,2065],{},"Missing ",[141,2066,2067],{"href":490},"SSL\u002FHTTPS support",[108,2069,2071],{"id":2070},"what-good-hosting-should-include","What good hosting should include",[135,2073,2074,2077,2080,2083,2086,2089,2092],{},[33,2075,2076],{},"Regular server software updates",[33,2078,2079],{},"Firewall protection",[33,2081,2082],{},"Malware scanning",[33,2084,2085],{},"Automatic daily backups",[33,2087,2088],{},"Free SSL certificates",[33,2090,2091],{},"DDoS protection",[33,2093,2094],{},"Isolated environments (especially on shared plans)",[52,2096],{},[22,2098,2100],{"id":2099},"signs-your-current-hosting-is-not-good-enough","Signs Your Current Hosting Is Not Good Enough",[15,2102,2103],{},"You might not need to switch hosts, but you should if you recognise several of these:",[135,2105,2106,2113,2116,2119,2122,2125,2128,2134],{},[33,2107,2108,2109,2112],{},"Your website is ",[141,2110,2111],{"href":849},"consistently slow"," despite optimisation",[33,2114,2115],{},"The site goes down periodically and you are not always told",[33,2117,2118],{},"You cannot get useful support when something breaks",[33,2120,2121],{},"You are on the cheapest shared plan and your business depends on the website",[33,2123,2124],{},"Backups are not automatic or you are not sure they exist",[33,2126,2127],{},"Your hosting provider's control panel feels outdated or confusing",[33,2129,2130,2133],{},[141,2131,2132],{"href":1797},"Email delivery"," from your site is unreliable",[33,2135,2136],{},"You have outgrown what the plan offers but upgrading is expensive or complicated",[52,2138],{},[22,2140,2142],{"id":2141},"what-to-look-for-when-choosing-a-host","What To Look For When Choosing a Host",[15,2144,2145],{},"If you are choosing a host for the first time or considering a switch:",[135,2147,2148,2154,2160,2166,2172,2178,2184,2190],{},[33,2149,2150,2153],{},[91,2151,2152],{},"Performance."," Look for SSD storage, adequate RAM, and good TTFB benchmarks.",[33,2155,2156,2159],{},[91,2157,2158],{},"Support."," 24\u002F7 support with people who actually understand hosting, not just script readers.",[33,2161,2162,2165],{},[91,2163,2164],{},"Backups."," Automatic daily backups with easy restore options.",[33,2167,2168,2171],{},[91,2169,2170],{},"Security."," Free SSL, firewall, malware scanning, and server-level protection.",[33,2173,2174,2177],{},[91,2175,2176],{},"Scalability."," Can you upgrade smoothly if your traffic grows?",[33,2179,2180,2183],{},[91,2181,2182],{},"Location."," Servers near your target audience for better speed.",[33,2185,2186,2189],{},[91,2187,2188],{},"Reputation."," Read reviews from real users, not affiliate marketing sites.",[33,2191,2192,2195],{},[91,2193,2194],{},"Migration help."," Good hosts will help you move your site from your current provider.",[52,2197],{},[22,2199,2201],{"id":2200},"the-difference-between-cheap-and-value","The Difference Between Cheap and Value",[15,2203,2204],{},"Budget hosting is fine for a personal blog or a hobby project. It is not fine for a business website that generates leads, sales, or represents your brand.",[15,2206,2207],{},"The difference between a low-cost host and a quality one is usually modest — often the price of a cup of coffee per week. But the difference in performance, reliability, and support can be significant.",[108,2209,2211],{"id":2210},"what-cheap-hosting-typically-means","What cheap hosting typically means",[135,2213,2214,2217,2220,2223,2226],{},[33,2215,2216],{},"Shared resources with hundreds of other sites",[33,2218,2219],{},"Slow support with limited expertise",[33,2221,2222],{},"No automatic backups or unreliable backup systems",[33,2224,2225],{},"Oversold servers that slow down during peak hours",[33,2227,2228],{},"Limited ability to scale",[108,2230,2232],{"id":2231},"what-good-hosting-typically-means","What good hosting typically means",[135,2234,2235,2238,2241,2244,2247],{},[33,2236,2237],{},"Isolated or semi-isolated resources",[33,2239,2240],{},"Fast, knowledgeable support",[33,2242,2243],{},"Daily backups with verified restores",[33,2245,2246],{},"Consistent performance regardless of traffic",[33,2248,2249],{},"Easy upgrades when you need more",[52,2251],{},[22,2253,433],{"id":432},[15,2255,2256,2257,2260],{},"Hosting is the foundation your website sits on. A well-built site on bad hosting will ",[141,2258,2259],{"href":812},"underperform",". A simple site on good hosting will feel fast and reliable.",[15,2262,2263],{},"Most business owners do not need the most expensive hosting available. But they do need hosting that is reliable, fast enough, properly secured, and backed up.",[15,2265,2266],{},"If you are unsure whether your current hosting is adequate, the simplest test is this: is your website fast, reliable, and secure? If the answer is not a confident yes, it is worth investigating.",{"title":444,"searchDepth":445,"depth":445,"links":2268},[2269,2270,2271,2277,2283,2287,2291,2292,2293,2297],{"id":24,"depth":445,"text":25},{"id":1806,"depth":445,"text":1807},{"id":1824,"depth":445,"text":1825,"children":2272},[2273,2274,2275,2276],{"id":1831,"depth":452,"text":1832},{"id":1860,"depth":452,"text":1861},{"id":1885,"depth":452,"text":1886},{"id":1907,"depth":452,"text":1908},{"id":1931,"depth":445,"text":1932,"children":2278},[2279,2280,2281,2282],{"id":1941,"depth":452,"text":1942},{"id":1948,"depth":452,"text":1949},{"id":1955,"depth":452,"text":1956},{"id":1962,"depth":452,"text":1963},{"id":1979,"depth":445,"text":1980,"children":2284},[2285,2286],{"id":1986,"depth":452,"text":1987},{"id":2007,"depth":452,"text":2008},{"id":2036,"depth":445,"text":2037,"children":2288},[2289,2290],{"id":2043,"depth":452,"text":2044},{"id":2070,"depth":452,"text":2071},{"id":2099,"depth":445,"text":2100},{"id":2141,"depth":445,"text":2142},{"id":2200,"depth":445,"text":2201,"children":2294},[2295,2296],{"id":2210,"depth":452,"text":2211},{"id":2231,"depth":452,"text":2232},{"id":432,"depth":445,"text":433},[477],{"title":2300,"titleAccent":2301,"description":2302,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":2303,"secondaryButtonLink":812},"Not sure if your hosting is holding you back?","Let's find out.","If your website is slow, unreliable, or you suspect hosting is the problem, I can review your setup and recommend the right solution for your business.","View performance services",{},"\u002Fblog\u002Fwhat-is-website-hosting-and-does-it-matter",{"title":1760,"description":2307,"ogImage":444},"A simple guide for business owners explaining what website hosting is, how different types compare, and how to know whether your hosting is good enough.","blog\u002Fwhat-is-website-hosting-and-does-it-matter",[842,499,2310,2311],"website performance","infrastructure","VwsvCtajnNSkqBMveKUbBxoNDkf-2KTZABtf2_A2mT0",{"id":2314,"title":2315,"author":2316,"body":2317,"categories":2996,"cta":2997,"date":486,"description":2321,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":3001,"navigation":386,"path":1304,"readingTime":1182,"seo":3002,"stem":3004,"tags":3005,"__hash__":3008},"blog\u002Fblog\u002Fwhy-did-my-website-get-hacked.md","Why Did My Website Get Hacked? Common Causes and What To Do Next",{"name":8,"avatar":9,"description":10},{"type":12,"value":2318,"toc":2949},[2319,2322,2325,2328,2330,2333,2336,2353,2356,2358,2362,2365,2368,2371,2375,2413,2416,2418,2422,2425,2428,2431,2435,2449,2451,2470,2474,2477,2479,2483,2486,2489,2492,2506,2509,2526,2529,2532,2534,2538,2541,2544,2547,2561,2564,2578,2581,2584,2586,2590,2593,2596,2599,2617,2620,2634,2637,2640,2642,2646,2649,2652,2655,2675,2678,2698,2701,2704,2706,2710,2713,2751,2753,2757,2760,2764,2767,2771,2774,2778,2781,2785,2788,2792,2795,2799,2802,2806,2809,2811,2815,2818,2822,2836,2840,2861,2863,2867,2870,2936,2938,2940,2943,2946],[15,2320,2321],{},"You visit your website and something is wrong. Maybe it redirects to a strange site. Maybe Google is warning visitors that your site is dangerous. Maybe your hosting provider sent you an email saying your account has been suspended.",[15,2323,2324],{},"Your website has been hacked, and you are wondering why. You are a small business. You are not a bank or a government agency. Why would anyone target you?",[15,2326,2327],{},"The answer is simpler — and more reassuring — than you think.",[22,2329,25],{"id":24},[15,2331,2332],{},"Most small business websites are not individually targeted. They are caught in automated scans that look for known vulnerabilities across millions of sites at once.",[15,2334,2335],{},"The most common reasons a website gets hacked:",[30,2337,2338,2341,2344,2347,2350],{},[33,2339,2340],{},"Outdated software (CMS, plugins, themes)",[33,2342,2343],{},"Weak or reused passwords",[33,2345,2346],{},"Vulnerable or abandoned plugins",[33,2348,2349],{},"Compromised hosting environment",[33,2351,2352],{},"No security measures in place",[15,2354,2355],{},"It is rarely personal. It is almost always preventable. And in most cases, it is fixable.",[52,2357],{},[22,2359,2361],{"id":2360},"why-small-business-sites-get-targeted","Why Small Business Sites Get Targeted",[15,2363,2364],{},"This is the first question everyone asks, and the answer surprises most people.",[15,2366,2367],{},"Hackers do not sit at a computer and decide to attack your specific business. Instead, they use automated tools that scan the entire internet for websites running outdated software with known vulnerabilities.",[15,2369,2370],{},"These tools do not care whether you are a multinational corporation or a local plumber. They care whether your website has a weakness they can exploit.",[108,2372,2374],{"id":2373},"what-hackers-want-from-small-sites","What hackers want from small sites",[135,2376,2377,2383,2389,2395,2401,2407],{},[33,2378,2379,2382],{},[91,2380,2381],{},"Spam distribution."," Your server can be used to send thousands of spam emails.",[33,2384,2385,2388],{},[91,2386,2387],{},"Malware hosting."," Your site can be used to distribute malicious files to your visitors.",[33,2390,2391,2394],{},[91,2392,2393],{},"SEO spam."," Hidden pages and links can be injected into your site to boost other websites in search rankings.",[33,2396,2397,2400],{},[91,2398,2399],{},"Redirect traffic."," Your visitors can be redirected to scam sites, gambling sites, or phishing pages.",[33,2402,2403,2406],{},[91,2404,2405],{},"Cryptocurrency mining."," Your server's resources can be used to mine cryptocurrency.",[33,2408,2409,2412],{},[91,2410,2411],{},"Botnet recruitment."," Your server can become part of a network used for larger attacks.",[15,2414,2415],{},"None of these require your specific site. They just need any site with an open door.",[52,2417],{},[22,2419,2421],{"id":2420},"_1-outdated-software","1. Outdated Software",[15,2423,2424],{},"This is the most common cause by far.",[15,2426,2427],{},"Every CMS (WordPress, Joomla, Drupal), every plugin, and every theme you use is software written by people. That software has bugs and security flaws that are discovered over time. When a flaw is found, the developer releases an update to fix it.",[15,2429,2430],{},"The problem is that the fix also tells the world exactly what the vulnerability was. Automated scanners then look for sites that have not applied the update and exploit the now-public vulnerability.",[108,2432,2434],{"id":2433},"what-this-looks-like","What this looks like",[135,2436,2437,2440,2443,2446],{},[33,2438,2439],{},"Your WordPress version is months or years behind",[33,2441,2442],{},"You have plugins that have not been updated in a long time",[33,2444,2445],{},"Your theme is no longer maintained by its developer",[33,2447,2448],{},"You receive update notifications but ignore them",[108,2450,307],{"id":306},[135,2452,2453,2458,2461,2464],{},[33,2454,2455],{},[141,2456,2457],{"href":1749},"Update your CMS, plugins, and themes regularly",[33,2459,2460],{},"Remove any plugins or themes you are not using",[33,2462,2463],{},"Replace plugins that have been abandoned by their developers",[33,2465,2466,2467,2469],{},"Set up a ",[141,2468,1066],{"href":485}," that includes regular updates",[108,2471,2473],{"id":2472},"plain-english-takeaway","Plain-English takeaway",[15,2475,2476],{},"An outdated website is like a building with a lock that everyone knows how to pick. The fix exists, you just need to apply it.",[52,2478],{},[22,2480,2482],{"id":2481},"_2-weak-or-reused-passwords","2. Weak or Reused Passwords",[15,2484,2485],{},"Simple passwords and reused credentials are the second most common way websites are compromised.",[15,2487,2488],{},"Automated tools try thousands of common username and password combinations against login pages. If your admin account is \"admin\" with a password like \"password123\" or your business name, it will be cracked quickly.",[108,2490,2434],{"id":2491},"what-this-looks-like-1",[135,2493,2494,2497,2500,2503],{},[33,2495,2496],{},"Your admin username is \"admin\"",[33,2498,2499],{},"Your password is short, simple, or used on other accounts",[33,2501,2502],{},"Multiple people share the same login credentials",[33,2504,2505],{},"You have never changed the password since the site was built",[108,2507,307],{"id":2508},"what-to-do-1",[135,2510,2511,2514,2517,2520,2523],{},[33,2512,2513],{},"Use a strong, unique password for every account",[33,2515,2516],{},"Change the default admin username",[33,2518,2519],{},"Enable two-factor authentication if available",[33,2521,2522],{},"Limit login attempts to slow down brute force attacks",[33,2524,2525],{},"Use a password manager to generate and store strong passwords",[108,2527,2473],{"id":2528},"plain-english-takeaway-1",[15,2530,2531],{},"If your password is easy to remember, it is probably easy to guess.",[52,2533],{},[22,2535,2537],{"id":2536},"_3-vulnerable-or-abandoned-plugins","3. Vulnerable or Abandoned Plugins",[15,2539,2540],{},"Not all plugins are created equal. Some are well-maintained by professional teams. Others are side projects that were abandoned years ago.",[15,2542,2543],{},"An abandoned plugin is a serious risk because nobody is fixing its security flaws. Even active plugins can have vulnerabilities, but at least those get patched. Abandoned ones do not.",[108,2545,2434],{"id":2546},"what-this-looks-like-2",[135,2548,2549,2552,2555,2558],{},[33,2550,2551],{},"You have plugins that have not been updated in over a year",[33,2553,2554],{},"The plugin's support page shows unanswered questions",[33,2556,2557],{},"The plugin was downloaded from an untrusted source",[33,2559,2560],{},"You installed a \"free\" version of a premium plugin (nulled software)",[108,2562,307],{"id":2563},"what-to-do-2",[135,2565,2566,2569,2572,2575],{},[33,2567,2568],{},"Audit your plugins and remove anything you do not actively use",[33,2570,2571],{},"Replace abandoned plugins with maintained alternatives",[33,2573,2574],{},"Only install plugins from trusted sources (official repositories)",[33,2576,2577],{},"Never use nulled or pirated plugin versions — they frequently contain malware",[108,2579,2473],{"id":2580},"plain-english-takeaway-2",[15,2582,2583],{},"Every plugin is a potential door into your website. Make sure each one is maintained and locked.",[52,2585],{},[22,2587,2589],{"id":2588},"_4-compromised-hosting-environment","4. Compromised Hosting Environment",[15,2591,2592],{},"Sometimes the problem is not your website at all. It is the server it sits on.",[15,2594,2595],{},"On shared hosting, your website shares a server with many other sites. If one of those sites is compromised, the attacker may be able to access other sites on the same server, including yours.",[108,2597,2434],{"id":2598},"what-this-looks-like-3",[135,2600,2601,2604,2607,2614],{},[33,2602,2603],{},"Multiple websites on the same server were hacked at the same time",[33,2605,2606],{},"Your site was compromised even though you kept everything updated",[33,2608,2609,2610,2613],{},"Your ",[141,2611,2612],{"href":2305},"hosting provider"," has a history of security incidents",[33,2615,2616],{},"The server software itself is outdated",[108,2618,307],{"id":2619},"what-to-do-3",[135,2621,2622,2625,2628,2631],{},[33,2623,2624],{},"Ask your hosting provider about their security measures",[33,2626,2627],{},"Consider upgrading to a VPS or managed hosting with isolated environments",[33,2629,2630],{},"Make sure your hosting provider keeps server software up to date",[33,2632,2633],{},"Use a host that provides server-level firewalls and malware scanning",[108,2635,2473],{"id":2636},"plain-english-takeaway-3",[15,2638,2639],{},"Your website's security is only as strong as the environment it runs in.",[52,2641],{},[22,2643,2645],{"id":2644},"_5-no-security-measures-in-place","5. No Security Measures in Place",[15,2647,2648],{},"Many business websites are launched with no security measures beyond a password. No firewall. No malware scanning. No login protection. No backup strategy.",[15,2650,2651],{},"This is like building a shop, installing the cheapest lock available, and hoping nobody tries the door.",[108,2653,2434],{"id":2654},"what-this-looks-like-4",[135,2656,2657,2660,2663,2666,2672],{},[33,2658,2659],{},"You have never installed a security plugin or configured a firewall",[33,2661,2662],{},"There is no rate limiting on your login page",[33,2664,2665],{},"You do not receive alerts when something changes on your site",[33,2667,2668,2669],{},"You are not sure whether ",[141,2670,2671],{"href":490},"your site uses HTTPS",[33,2673,2674],{},"Backups either do not exist or have never been tested",[108,2676,307],{"id":2677},"what-to-do-4",[135,2679,2680,2683,2686,2689,2692,2695],{},[33,2681,2682],{},"Install a security plugin or firewall (Wordfence, Sucuri, or similar)",[33,2684,2685],{},"Enable login attempt limiting",[33,2687,2688],{},"Set up file integrity monitoring",[33,2690,2691],{},"Ensure HTTPS is active and properly configured",[33,2693,2694],{},"Set up automatic backups and verify they can be restored",[33,2696,2697],{},"Use security headers to protect against common attacks",[108,2699,2473],{"id":2700},"plain-english-takeaway-4",[15,2702,2703],{},"Security is not a feature you add after a hack. It is a foundation you build before one.",[52,2705],{},[22,2707,2709],{"id":2708},"how-to-tell-if-your-site-has-been-hacked","How To Tell If Your Site Has Been Hacked",[15,2711,2712],{},"Some hacks are obvious. Others are designed to stay hidden for as long as possible. Here are signs to watch for:",[135,2714,2715,2718,2721,2724,2727,2730,2736,2739,2745,2748],{},[33,2716,2717],{},"Your site redirects to unfamiliar websites",[33,2719,2720],{},"Google shows a \"This site may be hacked\" warning in search results",[33,2722,2723],{},"Your hosting provider suspends your account",[33,2725,2726],{},"Visitors report seeing spam content or pop-ups",[33,2728,2729],{},"You find pages or posts you did not create",[33,2731,2732,2733],{},"Your site is ",[141,2734,2735],{"href":849},"suddenly very slow",[33,2737,2738],{},"You cannot log in to your admin area",[33,2740,2741,2742],{},"Your site sends spam ",[141,2743,2744],{"href":1797},"emails you did not authorise",[33,2746,2747],{},"Unknown admin accounts appear in your user list",[33,2749,2750],{},"Files on your server have been recently modified without your knowledge",[52,2752],{},[22,2754,2756],{"id":2755},"immediate-steps-after-a-hack","Immediate Steps After a Hack",[15,2758,2759],{},"If you have confirmed or suspect a hack, act quickly:",[108,2761,2763],{"id":2762},"_1-do-not-panic","1. Do not panic",[15,2765,2766],{},"Most hacks are recoverable. Your website is not gone forever.",[108,2768,2770],{"id":2769},"_2-change-all-passwords-immediately","2. Change all passwords immediately",[15,2772,2773],{},"Admin accounts, hosting accounts, FTP accounts, database passwords, and any connected services. Do this before anything else.",[108,2775,2777],{"id":2776},"_3-contact-your-hosting-provider","3. Contact your hosting provider",[15,2779,2780],{},"They may have security tools, backup access, or experience dealing with compromised sites. They may also need to unsuspend your account.",[108,2782,2784],{"id":2783},"_4-scan-your-site-for-malware","4. Scan your site for malware",[15,2786,2787],{},"Use a security scanner to identify infected files. Many security plugins can do this, and there are online scanning tools available.",[108,2789,2791],{"id":2790},"_5-restore-from-a-clean-backup","5. Restore from a clean backup",[15,2793,2794],{},"If you have a backup from before the hack, restoring it is often the fastest and most thorough fix. Make sure to update all software and change all passwords after restoring.",[108,2796,2798],{"id":2797},"_6-remove-the-vulnerability","6. Remove the vulnerability",[15,2800,2801],{},"Identify how the hack happened and fix the root cause. If it was an outdated plugin, update or remove it. If it was a weak password, strengthen it. Otherwise, the site will be compromised again.",[108,2803,2805],{"id":2804},"_7-request-a-review-from-google","7. Request a review from Google",[15,2807,2808],{},"If Google is showing a warning for your site, you can request a review through Google Search Console once the site is cleaned up.",[52,2810],{},[22,2812,2814],{"id":2813},"when-to-rebuild-vs-when-to-clean-up","When To Rebuild vs When To Clean Up",[15,2816,2817],{},"In most cases, a hacked site can be cleaned and recovered. But sometimes rebuilding is the better option.",[108,2819,2821],{"id":2820},"clean-up-when","Clean up when",[135,2823,2824,2827,2830,2833],{},[33,2825,2826],{},"The hack was limited in scope (a single vulnerability exploited)",[33,2828,2829],{},"You have a clean backup available",[33,2831,2832],{},"The site is relatively new or recently updated",[33,2834,2835],{},"The underlying platform and plugins are still maintained",[108,2837,2839],{"id":2838},"rebuild-when","Rebuild when",[135,2841,2842,2845,2848,2851,2858],{},[33,2843,2844],{},"The site has been compromised multiple times",[33,2846,2847],{},"The codebase is heavily modified and difficult to audit",[33,2849,2850],{},"The platform, theme, or plugins are severely outdated",[33,2852,2853,2854,2857],{},"The site was due for a ",[141,2855,2856],{"href":575},"redesign or rebuild"," anyway",[33,2859,2860],{},"You cannot determine the full extent of the compromise",[52,2862],{},[22,2864,2866],{"id":2865},"how-to-prevent-future-hacks","How To Prevent Future Hacks",[15,2868,2869],{},"Prevention is always cheaper and less stressful than recovery.",[135,2871,2873,2879,2885,2891,2897,2903,2909,2915,2924,2930],{"className":2872},[378],[33,2874,2876,2878],{"className":2875},[382],[384,2877],{"disabled":386,"type":387}," Keep all software updated (CMS, plugins, themes)",[33,2880,2882,2884],{"className":2881},[382],[384,2883],{"disabled":386,"type":387}," Use strong, unique passwords with two-factor authentication",[33,2886,2888,2890],{"className":2887},[382],[384,2889],{"disabled":386,"type":387}," Remove unused plugins and themes",[33,2892,2894,2896],{"className":2893},[382],[384,2895],{"disabled":386,"type":387}," Only install plugins from trusted sources",[33,2898,2900,2902],{"className":2899},[382],[384,2901],{"disabled":386,"type":387}," Use a security plugin with firewall and malware scanning",[33,2904,2906,2908],{"className":2905},[382],[384,2907],{"disabled":386,"type":387}," Set up automatic daily backups and verify they work",[33,2910,2912,2914],{"className":2911},[382],[384,2913],{"disabled":386,"type":387}," Use HTTPS with a valid SSL certificate",[33,2916,2918,2920,2921],{"className":2917},[382],[384,2919],{"disabled":386,"type":387}," Choose ",[141,2922,2923],{"href":2305},"hosting with proper security measures",[33,2925,2927,2929],{"className":2926},[382],[384,2928],{"disabled":386,"type":387}," Limit admin access to people who need it",[33,2931,2933,2935],{"className":2932},[382],[384,2934],{"disabled":386,"type":387}," Monitor your site for unexpected changes",[52,2937],{},[22,2939,433],{"id":432},[15,2941,2942],{},"Getting hacked feels personal, but it almost never is. Your website was not chosen. It was found by an automated scan that exploits known weaknesses across millions of sites.",[15,2944,2945],{},"The causes are nearly always the same: outdated software, weak passwords, abandoned plugins, or missing security basics. And the solutions are straightforward: keep things updated, use strong credentials, remove what you do not need, and put basic protection in place.",[15,2947,2948],{},"If your site has been hacked, the priority is recovery and then prevention. If it has not been hacked yet, the priority is making sure the basics are covered before it happens.",{"title":444,"searchDepth":445,"depth":445,"links":2950},[2951,2952,2955,2960,2965,2970,2975,2980,2981,2990,2994,2995],{"id":24,"depth":445,"text":25},{"id":2360,"depth":445,"text":2361,"children":2953},[2954],{"id":2373,"depth":452,"text":2374},{"id":2420,"depth":445,"text":2421,"children":2956},[2957,2958,2959],{"id":2433,"depth":452,"text":2434},{"id":306,"depth":452,"text":307},{"id":2472,"depth":452,"text":2473},{"id":2481,"depth":445,"text":2482,"children":2961},[2962,2963,2964],{"id":2491,"depth":452,"text":2434},{"id":2508,"depth":452,"text":307},{"id":2528,"depth":452,"text":2473},{"id":2536,"depth":445,"text":2537,"children":2966},[2967,2968,2969],{"id":2546,"depth":452,"text":2434},{"id":2563,"depth":452,"text":307},{"id":2580,"depth":452,"text":2473},{"id":2588,"depth":445,"text":2589,"children":2971},[2972,2973,2974],{"id":2598,"depth":452,"text":2434},{"id":2619,"depth":452,"text":307},{"id":2636,"depth":452,"text":2473},{"id":2644,"depth":445,"text":2645,"children":2976},[2977,2978,2979],{"id":2654,"depth":452,"text":2434},{"id":2677,"depth":452,"text":307},{"id":2700,"depth":452,"text":2473},{"id":2708,"depth":445,"text":2709},{"id":2755,"depth":445,"text":2756,"children":2982},[2983,2984,2985,2986,2987,2988,2989],{"id":2762,"depth":452,"text":2763},{"id":2769,"depth":452,"text":2770},{"id":2776,"depth":452,"text":2777},{"id":2783,"depth":452,"text":2784},{"id":2790,"depth":452,"text":2791},{"id":2797,"depth":452,"text":2798},{"id":2804,"depth":452,"text":2805},{"id":2813,"depth":445,"text":2814,"children":2991},[2992,2993],{"id":2820,"depth":452,"text":2821},{"id":2838,"depth":452,"text":2839},{"id":2865,"depth":445,"text":2866},{"id":432,"depth":445,"text":433},[477],{"title":2998,"titleAccent":2999,"description":3000,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":484,"secondaryButtonLink":485},"Has your website been hacked?","Let's clean it up.","If your site has been compromised, I can remove the malware, secure the vulnerabilities, and set up protection so it does not happen again.",{},{"title":2315,"description":3003,"ogImage":444},"A practical guide for business owners whose website has been compromised. Explains why small sites get targeted, common causes, immediate steps, and prevention.","blog\u002Fwhy-did-my-website-get-hacked",[498,3006,499,3007],"hacking","WordPress","Dk16fRmCnBB-M3MLezqR0HZGCo9zp09Rda1WBVS4fx0",{"id":3010,"title":3011,"author":3012,"body":3013,"categories":3652,"cta":3653,"date":486,"description":3017,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":3657,"navigation":386,"path":1797,"readingTime":1182,"seo":3658,"stem":3660,"tags":3661,"__hash__":3665},"blog\u002Fblog\u002Fwhy-do-emails-from-my-website-go-to-spam.md","Why Do Emails From My Website Go to Spam? What Business Owners Need to Check",{"name":8,"avatar":9,"description":10},{"type":12,"value":3014,"toc":3609},[3015,3018,3021,3024,3026,3029,3052,3055,3057,3061,3064,3067,3070,3072,3076,3078,3081,3085,3091,3097,3103,3105,3119,3121,3139,3141,3144,3146,3150,3153,3164,3166,3177,3179,3193,3195,3198,3200,3204,3207,3210,3212,3226,3228,3247,3249,3252,3254,3258,3261,3264,3268,3291,3293,3310,3312,3315,3317,3321,3328,3331,3333,3347,3349,3363,3365,3368,3370,3374,3377,3380,3382,3396,3399,3416,3419,3422,3424,3428,3431,3434,3437,3451,3454,3471,3474,3477,3479,3483,3486,3549,3552,3554,3558,3561,3578,3581,3583,3585,3588,3599,3602],[15,3016,3017],{},"Your website sends an email. A contact form notification, an order confirmation, a password reset, a booking receipt. But instead of landing in the inbox, it ends up in spam. Or it disappears entirely.",[15,3019,3020],{},"This is one of the most frustrating problems a business website can have. Everything appears to work. The form submits. The order goes through. But the email never reaches the person it was meant for.",[15,3022,3023],{},"The reasons are almost always the same, and most of them are fixable.",[22,3025,25],{"id":24},[15,3027,3028],{},"If emails from your website are going to spam, it is usually one of these:",[30,3030,3031,3034,3037,3040,3043,3046,3049],{},[33,3032,3033],{},"Your domain is missing email authentication records",[33,3035,3036],{},"Your website is sending from the wrong address",[33,3038,3039],{},"Your hosting server has a bad reputation",[33,3041,3042],{},"The email content looks like spam",[33,3044,3045],{},"You are using your server's built-in mail instead of a proper email service",[33,3047,3048],{},"Your SMTP plugin is misconfigured",[33,3050,3051],{},"You have no sending reputation at all",[15,3053,3054],{},"For most business websites, the core problem is that nobody set up email authentication when the site was built.",[52,3056],{},[22,3058,3060],{"id":3059},"why-website-emails-are-different-from-normal-emails","Why Website Emails Are Different From Normal Emails",[15,3062,3063],{},"When you send an email from Gmail or Outlook, it goes through Google's or Microsoft's servers. These servers are trusted, authenticated, and have a strong reputation. Email providers know who is sending and trust the source.",[15,3065,3066],{},"When your website sends an email, it usually goes through your web hosting server. That server is not primarily designed for email. It may share an IP address with hundreds of other websites. It probably has no special reputation with email providers.",[15,3068,3069],{},"From Gmail's or Outlook's perspective, an email from a random web server looks suspicious by default. That is why website emails are treated differently and why they often end up in spam.",[52,3071],{},[22,3073,3075],{"id":3074},"_1-your-domain-is-missing-email-authentication-records","1. Your Domain Is Missing Email Authentication Records",[15,3077,2424],{},[15,3079,3080],{},"Email authentication is a set of DNS records that tell email providers \"yes, this server is allowed to send emails on behalf of my domain.\" Without these records, email providers have no way to verify the email is legitimate.",[108,3082,3084],{"id":3083},"the-three-records-you-need","The three records you need",[15,3086,3087,3090],{},[91,3088,3089],{},"SPF (Sender Policy Framework)"," — Lists which servers are allowed to send email for your domain. Without it, anyone could pretend to send email from your address.",[15,3092,3093,3096],{},[91,3094,3095],{},"DKIM (DomainKeys Identified Mail)"," — Adds a digital signature to your emails so the recipient can verify the email was not altered in transit.",[15,3098,3099,3102],{},[91,3100,3101],{},"DMARC (Domain-based Message Authentication)"," — Tells email providers what to do when an email fails SPF or DKIM checks. It also lets you receive reports about emails sent from your domain.",[108,3104,2434],{"id":2433},[135,3106,3107,3110,3113,3116],{},[33,3108,3109],{},"Emails from your website consistently land in spam across different providers",[33,3111,3112],{},"You have never heard of SPF, DKIM, or DMARC",[33,3114,3115],{},"Nobody has ever set up DNS records specifically for email",[33,3117,3118],{},"Your domain was registered but only the basic settings were configured",[108,3120,307],{"id":306},[135,3122,3123,3126,3129],{},[33,3124,3125],{},"Ask your developer or hosting provider to set up SPF, DKIM, and DMARC records",[33,3127,3128],{},"If you use a third-party email service (Mailgun, SendGrid, Amazon SES), follow their DNS setup guide",[33,3130,3131,3132,3138],{},"Use a free tool like ",[141,3133,3137],{"href":3134,"rel":3135},"https:\u002F\u002Fmxtoolbox.com\u002F",[3136],"nofollow","MXToolbox"," to check whether your records are in place",[108,3140,2473],{"id":2472},[15,3142,3143],{},"Without authentication records, your domain is basically sending emails without any ID. Email providers treat unverified senders the same way you would treat an unmarked letter.",[52,3145],{},[22,3147,3149],{"id":3148},"_2-your-website-is-sending-from-the-wrong-address","2. Your Website Is Sending From the Wrong Address",[15,3151,3152],{},"The \"from\" address on your website emails matters more than most people realise.",[15,3154,3155,3156,3159,3160,3163],{},"If your website sends form notifications from ",[71,3157,3158],{},"wordpress@server123.hostingcompany.com"," or ",[71,3161,3162],{},"noreply@yourdomain.com"," but your domain's email is hosted with Google Workspace, there is a mismatch. The email claims to come from your domain, but it is actually sent from a different server that is not authorised to use that domain.",[108,3165,2434],{"id":2491},[135,3167,3168,3171,3174],{},[33,3169,3170],{},"The sender address on form emails looks unfamiliar or generic",[33,3172,3173],{},"The \"from\" address does not match your actual business email domain",[33,3175,3176],{},"Emails from your site look different from emails you send manually",[108,3178,307],{"id":2508},[135,3180,3181,3184,3187,3190],{},[33,3182,3183],{},"Check your form plugin or website settings for the \"from\" email address",[33,3185,3186],{},"Make sure it matches your actual domain",[33,3188,3189],{},"If it does not match, either update it or set up proper SPF records to authorise the sending server",[33,3191,3192],{},"Consider using a dedicated SMTP service that sends from your verified domain",[108,3194,2473],{"id":2528},[15,3196,3197],{},"If your website claims to send emails from your domain but the server is not authorised to do so, email providers will flag it.",[52,3199],{},[22,3201,3203],{"id":3202},"_3-your-hosting-server-has-a-bad-reputation","3. Your Hosting Server Has a Bad Reputation",[15,3205,3206],{},"On shared hosting, your website shares a server and an IP address with dozens or hundreds of other websites.",[15,3208,3209],{},"If any of those websites send spam, the IP address gets flagged. Once an IP is on a blacklist, every email sent from that server is treated with suspicion, including yours.",[108,3211,2434],{"id":2546},[135,3213,3214,3217,3220,3223],{},[33,3215,3216],{},"Your emails worked fine initially but gradually started landing in spam",[33,3218,3219],{},"Other people on the same hosting plan report similar issues",[33,3221,3222],{},"Your hosting provider is a budget shared hosting company",[33,3224,3225],{},"Emails from your site are inconsistent: sometimes they arrive, sometimes they do not",[108,3227,307],{"id":2563},[135,3229,3230,3238,3241,3244],{},[33,3231,3232,3233],{},"Check your server's IP reputation using tools like ",[141,3234,3237],{"href":3235,"rel":3236},"https:\u002F\u002Fmxtoolbox.com\u002Fblacklists.aspx",[3136],"MXToolbox Blacklist Check",[33,3239,3240],{},"Contact your hosting provider and ask about IP reputation",[33,3242,3243],{},"Switch to a dedicated email sending service that uses clean, monitored IP addresses",[33,3245,3246],{},"Consider upgrading to hosting with a dedicated IP if email volume is important",[108,3248,2473],{"id":2580},[15,3250,3251],{},"On shared hosting, your email reputation is only as good as your worst neighbour.",[52,3253],{},[22,3255,3257],{"id":3256},"_4-the-email-content-looks-like-spam","4. The Email Content Looks Like Spam",[15,3259,3260],{},"Even with proper authentication, the content of your emails can trigger spam filters.",[15,3262,3263],{},"Spam filters analyse the subject line, body text, links, formatting, and attachments. Certain patterns that are common in spam emails can cause legitimate messages to be filtered.",[108,3265,3267],{"id":3266},"common-triggers","Common triggers",[135,3269,3270,3273,3276,3279,3282,3285,3288],{},[33,3271,3272],{},"Subject lines with excessive capitalisation or punctuation (FREE!!! CLICK NOW!!!)",[33,3274,3275],{},"Emails that are mostly images with very little text",[33,3277,3278],{},"Too many links in a single email",[33,3280,3281],{},"Shortened URLs or suspicious-looking links",[33,3283,3284],{},"Words and phrases commonly associated with spam",[33,3286,3287],{},"Missing unsubscribe link in marketing emails",[33,3289,3290],{},"HTML-heavy emails with poor formatting",[108,3292,307],{"id":2619},[135,3294,3295,3298,3301,3304,3307],{},[33,3296,3297],{},"Keep email content simple and professional",[33,3299,3300],{},"Use a clear, honest subject line",[33,3302,3303],{},"Include enough plain text alongside any images",[33,3305,3306],{},"Avoid excessive links or promotional language in transactional emails",[33,3308,3309],{},"Make sure marketing emails include an unsubscribe option",[108,3311,2473],{"id":2636},[15,3313,3314],{},"Write your emails the way you would want to receive them. If it reads like spam, filters will treat it like spam.",[52,3316],{},[22,3318,3320],{"id":3319},"_5-you-are-using-server-mail-instead-of-a-proper-email-service","5. You Are Using Server Mail Instead of a Proper Email Service",[15,3322,3323,3324,3327],{},"Most websites send emails using PHP's built-in ",[71,3325,3326],{},"mail()"," function or a similar server-level method. This is the default on many hosting platforms and CMS installations.",[15,3329,3330],{},"The problem is that server-level email has no delivery tracking, no authentication by default, no retry logic, and no reputation management. It is the digital equivalent of dropping a letter in a random postbox and hoping for the best.",[108,3332,2434],{"id":2598},[135,3334,3335,3338,3341,3344],{},[33,3336,3337],{},"You have never configured any email settings on your website",[33,3339,3340],{},"Your developer did not mention anything about email delivery during setup",[33,3342,3343],{},"You have no way to see whether emails were sent, delivered, or bounced",[33,3345,3346],{},"Form emails work inconsistently",[108,3348,307],{"id":2677},[135,3350,3351,3354,3357,3360],{},[33,3352,3353],{},"Set up an SMTP plugin or integration on your website",[33,3355,3356],{},"Use a dedicated email sending service (SendGrid, Mailgun, Postmark, Amazon SES)",[33,3358,3359],{},"These services provide authentication, tracking, and clean IP addresses",[33,3361,3362],{},"Most offer free tiers that are more than enough for small business websites",[108,3364,2473],{"id":2700},[15,3366,3367],{},"Server-level email is unreliable by design. A proper email service is one of the most impactful upgrades you can make.",[52,3369],{},[22,3371,3373],{"id":3372},"_6-your-smtp-plugin-is-misconfigured","6. Your SMTP Plugin Is Misconfigured",[15,3375,3376],{},"If you have already set up an SMTP plugin, the settings might not be correct.",[15,3378,3379],{},"A wrong port number, an expired password, an incorrect encryption method, or a mismatched sender address can all cause emails to fail silently or be rejected.",[108,3381,2434],{"id":2654},[135,3383,3384,3387,3390,3393],{},[33,3385,3386],{},"You set up SMTP but emails still go to spam or do not arrive",[33,3388,3389],{},"The SMTP plugin shows errors in its log",[33,3391,3392],{},"Emails stopped working after a password change or server migration",[33,3394,3395],{},"The plugin sends test emails successfully but real form emails fail",[108,3397,307],{"id":3398},"what-to-do-5",[135,3400,3401,3404,3407,3410,3413],{},[33,3402,3403],{},"Open your SMTP plugin settings and verify every field",[33,3405,3406],{},"Check that the username, password, host, port, and encryption settings match your email provider's requirements",[33,3408,3409],{},"Send a test email from the plugin's settings page",[33,3411,3412],{},"Check the plugin's email log for delivery failures or errors",[33,3414,3415],{},"If you recently changed passwords or migrated hosting, update the SMTP credentials",[108,3417,2473],{"id":3418},"plain-english-takeaway-5",[15,3420,3421],{},"SMTP is the right approach, but it only works if the settings are correct and kept up to date.",[52,3423],{},[22,3425,3427],{"id":3426},"_7-you-have-no-sending-reputation-at-all","7. You Have No Sending Reputation At All",[15,3429,3430],{},"Email providers use reputation to decide whether to trust emails from your domain. If your domain is new or has never sent emails before, there is no reputation to rely on.",[15,3432,3433],{},"This is different from having a bad reputation. It means email providers simply do not know whether to trust you, so they err on the side of caution.",[108,3435,2434],{"id":3436},"what-this-looks-like-5",[135,3438,3439,3442,3445,3448],{},[33,3440,3441],{},"Your domain is relatively new",[33,3443,3444],{},"You have never sent marketing emails or newsletters",[33,3446,3447],{},"Your website is the only thing that sends emails from your domain",[33,3449,3450],{},"Emails sometimes arrive and sometimes do not, with no clear pattern",[108,3452,307],{"id":3453},"what-to-do-6",[135,3455,3456,3459,3462,3465,3468],{},[33,3457,3458],{},"Set up email authentication (SPF, DKIM, DMARC) to establish a baseline of trust",[33,3460,3461],{},"Start with low email volumes and increase gradually",[33,3463,3464],{},"Make sure recipients are expecting your emails (form confirmations, order receipts)",[33,3466,3467],{},"Avoid sending bulk emails from a brand-new domain",[33,3469,3470],{},"Use a reputable email sending service that shares its established reputation",[108,3472,2473],{"id":3473},"plain-english-takeaway-6",[15,3475,3476],{},"Trust is earned. A new domain with no history needs to build credibility before email providers will reliably deliver to the inbox.",[52,3478],{},[22,3480,3482],{"id":3481},"a-quick-email-health-checklist","A Quick Email Health Checklist",[15,3484,3485],{},"Run through this to assess your situation:",[135,3487,3489,3495,3501,3507,3513,3519,3525,3531,3537,3543],{"className":3488},[378],[33,3490,3492,3494],{"className":3491},[382],[384,3493],{"disabled":386,"type":387}," Do you have an SPF record for your domain?",[33,3496,3498,3500],{"className":3497},[382],[384,3499],{"disabled":386,"type":387}," Do you have a DKIM record configured?",[33,3502,3504,3506],{"className":3503},[382],[384,3505],{"disabled":386,"type":387}," Do you have a DMARC policy set up?",[33,3508,3510,3512],{"className":3509},[382],[384,3511],{"disabled":386,"type":387}," Does your website send emails from an address that matches your domain?",[33,3514,3516,3518],{"className":3515},[382],[384,3517],{"disabled":386,"type":387}," Are you using SMTP or an external email service instead of server mail?",[33,3520,3522,3524],{"className":3521},[382],[384,3523],{"disabled":386,"type":387}," Is your server's IP address clean (not blacklisted)?",[33,3526,3528,3530],{"className":3527},[382],[384,3529],{"disabled":386,"type":387}," Do your emails contain simple, professional content?",[33,3532,3534,3536],{"className":3533},[382],[384,3535],{"disabled":386,"type":387}," Can you see delivery logs for emails your website sends?",[33,3538,3540,3542],{"className":3539},[382],[384,3541],{"disabled":386,"type":387}," Have you tested by sending to Gmail, Outlook, and Yahoo?",[33,3544,3546,3548],{"className":3545},[382],[384,3547],{"disabled":386,"type":387}," Do marketing emails include an unsubscribe option?",[15,3550,3551],{},"If fewer than half of those are ticked, you have clear areas to improve.",[52,3553],{},[22,3555,3557],{"id":3556},"what-to-ask-your-developer-or-provider","What To Ask Your Developer or Provider",[15,3559,3560],{},"If you need help, here are the right questions to ask:",[135,3562,3563,3566,3569,3572,3575],{},[33,3564,3565],{},"Are SPF, DKIM, and DMARC records set up for my domain?",[33,3567,3568],{},"What method does my website use to send emails?",[33,3570,3571],{},"Is the sending IP address on any blacklists?",[33,3573,3574],{},"Can we set up a dedicated email sending service?",[33,3576,3577],{},"Is there a log of sent emails so we can track delivery?",[15,3579,3580],{},"A good developer should be able to answer all of these clearly and set up proper email delivery without requiring you to understand the technical details.",[52,3582],{},[22,3584,433],{"id":432},[15,3586,3587],{},"Most website email problems are not mysterious. They come down to a few basics:",[135,3589,3590,3593,3596],{},[33,3591,3592],{},"your domain has no authentication records",[33,3594,3595],{},"your server is not trusted to send email",[33,3597,3598],{},"nobody configured a proper email delivery method",[15,3600,3601],{},"The fix is usually straightforward: set up SPF, DKIM, and DMARC, use a reliable email service, and make sure your sending address matches your domain.",[15,3603,3604,3605,3608],{},"If your ",[141,3606,3607],{"href":143},"contact form has stopped working"," or your customers are not receiving order confirmations, the email delivery setup is the first place to look.",{"title":444,"searchDepth":445,"depth":445,"links":3610},[3611,3612,3613,3619,3624,3629,3634,3639,3644,3649,3650,3651],{"id":24,"depth":445,"text":25},{"id":3059,"depth":445,"text":3060},{"id":3074,"depth":445,"text":3075,"children":3614},[3615,3616,3617,3618],{"id":3083,"depth":452,"text":3084},{"id":2433,"depth":452,"text":2434},{"id":306,"depth":452,"text":307},{"id":2472,"depth":452,"text":2473},{"id":3148,"depth":445,"text":3149,"children":3620},[3621,3622,3623],{"id":2491,"depth":452,"text":2434},{"id":2508,"depth":452,"text":307},{"id":2528,"depth":452,"text":2473},{"id":3202,"depth":445,"text":3203,"children":3625},[3626,3627,3628],{"id":2546,"depth":452,"text":2434},{"id":2563,"depth":452,"text":307},{"id":2580,"depth":452,"text":2473},{"id":3256,"depth":445,"text":3257,"children":3630},[3631,3632,3633],{"id":3266,"depth":452,"text":3267},{"id":2619,"depth":452,"text":307},{"id":2636,"depth":452,"text":2473},{"id":3319,"depth":445,"text":3320,"children":3635},[3636,3637,3638],{"id":2598,"depth":452,"text":2434},{"id":2677,"depth":452,"text":307},{"id":2700,"depth":452,"text":2473},{"id":3372,"depth":445,"text":3373,"children":3640},[3641,3642,3643],{"id":2654,"depth":452,"text":2434},{"id":3398,"depth":452,"text":307},{"id":3418,"depth":452,"text":2473},{"id":3426,"depth":445,"text":3427,"children":3645},[3646,3647,3648],{"id":3436,"depth":452,"text":2434},{"id":3453,"depth":452,"text":307},{"id":3473,"depth":452,"text":2473},{"id":3481,"depth":445,"text":3482},{"id":3556,"depth":445,"text":3557},{"id":432,"depth":445,"text":433},[477],{"title":3654,"titleAccent":3655,"description":3656,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":484,"secondaryButtonLink":485},"Tired of your website emails landing in spam?","Let's sort it out.","If your form notifications, order confirmations, or automated emails are not reaching inboxes, I can set up proper email authentication and reliable delivery for your domain.",{},{"title":3011,"description":3659,"ogImage":444},"A simple guide for business owners whose website emails keep landing in spam. Covers SPF, DKIM, DMARC, hosting issues, and practical fixes in plain English.","blog\u002Fwhy-do-emails-from-my-website-go-to-spam",[3662,3663,499,3664],"email deliverability","spam","troubleshooting","0jqOnyXuP0fqe6FSSqwvJoOxusR0LnEIx6uhUKVmixM",{"id":3667,"title":3668,"author":3669,"body":3670,"categories":4335,"cta":4336,"date":486,"description":3674,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":4341,"navigation":386,"path":203,"readingTime":1182,"seo":4342,"stem":4344,"tags":4345,"__hash__":4348},"blog\u002Fblog\u002Fwhy-does-google-not-show-my-business-website.md","Why Does Google Not Show My Business Website? A Plain-English SEO Checklist",{"name":8,"avatar":9,"description":10},{"type":12,"value":3671,"toc":4288},[3672,3675,3678,3680,3683,3709,3712,3714,3718,3721,3724,3729,3735,3737,3741,3744,3747,3749,3764,3766,3790,3792,3795,3797,3801,3804,3811,3813,3826,3828,3846,3848,3851,3853,3857,3860,3863,3865,3876,3878,3892,3894,3897,3899,3903,3906,3909,3911,3922,3924,3938,3940,3943,3945,3949,3952,3955,3957,3973,3975,3992,3994,3997,3999,4003,4006,4009,4011,4022,4024,4038,4040,4043,4045,4049,4052,4055,4058,4069,4071,4094,4096,4099,4101,4105,4108,4111,4114,4125,4128,4142,4145,4148,4150,4154,4157,4226,4229,4231,4235,4238,4241,4244,4258,4260,4262,4265,4268,4285],[15,3673,3674],{},"You built a website for your business. Maybe you even paid good money for it. But when you search for your company on Google, nothing comes up. Or worse, your competitors show up and you do not.",[15,3676,3677],{},"This is one of the most common frustrations business owners face. The good news is that the reasons are usually straightforward, and most of them can be fixed.",[22,3679,25],{"id":24},[15,3681,3682],{},"If Google is not showing your business website, it is usually one of these:",[30,3684,3685,3688,3691,3694,3697,3700,3703,3706],{},[33,3686,3687],{},"Google does not know your website exists",[33,3689,3690],{},"Your site is accidentally blocking Google",[33,3692,3693],{},"There is not enough real content",[33,3695,3696],{},"Your pages do not target what people actually search for",[33,3698,3699],{},"Your website has technical problems",[33,3701,3702],{},"You have no backlinks or online presence",[33,3704,3705],{},"Your Google Business Profile is missing or incomplete",[33,3707,3708],{},"Your competitors are simply doing more",[15,3710,3711],{},"Most of the time it is not one dramatic failure. It is a combination of gaps that add up.",[52,3713],{},[22,3715,3717],{"id":3716},"before-you-start-check-if-google-knows-about-your-site","Before You Start: Check If Google Knows About Your Site",[15,3719,3720],{},"The first thing to do is check whether Google has even seen your website.",[15,3722,3723],{},"Type this into Google:",[15,3725,3726],{},[71,3727,3728],{},"site:yourdomain.com",[15,3730,3731,3732,3734],{},"Replace ",[71,3733,324],{}," with your actual website address. If results appear, Google knows about your site. If nothing appears, Google has not indexed it yet and that is your starting point.",[52,3736],{},[22,3738,3740],{"id":3739},"_1-google-does-not-know-your-website-exists","1. Google Does Not Know Your Website Exists",[15,3742,3743],{},"This is more common than people think, especially with newer websites.",[15,3745,3746],{},"Google finds websites by following links from other sites and by reading sitemaps. If nobody links to your site and you have not submitted it to Google, it may simply not know you are there.",[108,3748,2434],{"id":2433},[135,3750,3751,3758,3761],{},[33,3752,3753,3754,3757],{},"The ",[71,3755,3756],{},"site:"," search returns zero results",[33,3759,3760],{},"Your website has been live for weeks or months with no search traffic",[33,3762,3763],{},"You have never set up Google Search Console",[108,3765,307],{"id":306},[135,3767,3768,3777,3780,3787],{},[33,3769,3770,3771,3776],{},"Create a free ",[141,3772,3775],{"href":3773,"rel":3774},"https:\u002F\u002Fsearch.google.com\u002Fsearch-console\u002Fabout",[3136],"Google Search Console"," account",[33,3778,3779],{},"Verify your website ownership",[33,3781,3782,3783,3786],{},"Submit your sitemap (usually at ",[71,3784,3785],{},"yourdomain.com\u002Fsitemap.xml",")",[33,3788,3789],{},"Request indexing for your most important pages",[108,3791,2473],{"id":2472},[15,3793,3794],{},"If you have never told Google about your website, do not be surprised that it has not found you.",[52,3796],{},[22,3798,3800],{"id":3799},"_2-your-site-is-accidentally-blocking-google","2. Your Site Is Accidentally Blocking Google",[15,3802,3803],{},"This happens more often than you would expect.",[15,3805,3806,3807,3810],{},"Websites have a small file called ",[71,3808,3809],{},"robots.txt"," and individual pages can carry tags that tell search engines not to index them. During development, these are often set to block Google. If nobody removes them when the site goes live, Google obeys and stays away.",[108,3812,2434],{"id":2491},[135,3814,3815,3818,3823],{},[33,3816,3817],{},"Google Search Console shows pages as \"not indexed\"",[33,3819,3753,3820,3822],{},[71,3821,3756],{}," search returns nothing despite the site being live",[33,3824,3825],{},"Your developer built the site on a staging environment and may not have updated settings",[108,3827,307],{"id":2508},[135,3829,3830,3840,3843],{},[33,3831,3832,3833,3836,3837],{},"Check ",[71,3834,3835],{},"yourdomain.com\u002Frobots.txt"," in your browser and look for ",[71,3838,3839],{},"Disallow: \u002F",[33,3841,3842],{},"Ask your developer whether any \"noindex\" tags are still on the site",[33,3844,3845],{},"In Google Search Console, use the URL Inspection tool to check individual pages",[108,3847,2473],{"id":2528},[15,3849,3850],{},"Your website might be telling Google to go away without you realising it.",[52,3852],{},[22,3854,3856],{"id":3855},"_3-there-is-not-enough-real-content","3. There Is Not Enough Real Content",[15,3858,3859],{},"Google ranks pages, not websites. If your site has five thin pages with a paragraph each, there is very little for Google to work with.",[15,3861,3862],{},"Search engines need text to understand what your business does, where you operate, and what problems you solve. A beautiful design with almost no words gives Google nothing to match against what people are searching for.",[108,3864,2434],{"id":2546},[135,3866,3867,3870,3873],{},[33,3868,3869],{},"Your pages have very little text",[33,3871,3872],{},"Most of your content is in images, not in actual readable text",[33,3874,3875],{},"You have a homepage, an about page, a contact page, and not much else",[108,3877,307],{"id":2563},[135,3879,3880,3883,3886,3889],{},[33,3881,3882],{},"Write genuinely useful content on your service pages explaining what you do and who it is for",[33,3884,3885],{},"Add an FAQ section answering real questions your customers ask",[33,3887,3888],{},"Consider starting a blog or resource section covering topics your audience cares about",[33,3890,3891],{},"Make sure important text is actual text, not baked into images",[108,3893,2473],{"id":2580},[15,3895,3896],{},"Google cannot rank what it cannot read. Give it something meaningful to work with.",[52,3898],{},[22,3900,3902],{"id":3901},"_4-your-pages-do-not-target-what-people-actually-search-for","4. Your Pages Do Not Target What People Actually Search For",[15,3904,3905],{},"This is one of the biggest gaps between what business owners expect and how Google actually works.",[15,3907,3908],{},"You might have a page called \"Our Services\" but if nobody searches for \"Our Services\" and the page does not mention the specific things people look for, Google has no reason to show it.",[108,3910,2434],{"id":2598},[135,3912,3913,3916,3919],{},[33,3914,3915],{},"You have pages but they use internal language, not customer language",[33,3917,3918],{},"Your service descriptions are vague or generic",[33,3920,3921],{},"You rank for your business name but nothing else",[108,3923,307],{"id":2619},[135,3925,3926,3929,3932,3935],{},[33,3927,3928],{},"Think about what your ideal customer would type into Google",[33,3930,3931],{},"Use those phrases naturally in your page titles, headings, and body text",[33,3933,3934],{},"Create separate pages for each major service or offering instead of listing everything on one page",[33,3936,3937],{},"Look at what your competitors rank for and notice the gaps",[108,3939,2473],{"id":2636},[15,3941,3942],{},"Your website needs to speak the same language your customers use when they search.",[52,3944],{},[22,3946,3948],{"id":3947},"_5-your-website-has-technical-problems","5. Your Website Has Technical Problems",[15,3950,3951],{},"Even if your content is good, technical issues can stop Google from indexing or ranking your pages properly.",[15,3953,3954],{},"Common problems include slow loading times, pages that do not work on mobile, broken links, missing page titles, and duplicate content.",[108,3956,2434],{"id":2654},[135,3958,3959,3962,3967,3970],{},[33,3960,3961],{},"Google Search Console shows errors or warnings",[33,3963,2732,3964],{},[141,3965,3966],{"href":849},"noticeably slow",[33,3968,3969],{},"Pages look broken or badly formatted on phones",[33,3971,3972],{},"Multiple pages have the same title or description",[108,3974,307],{"id":2677},[135,3976,3977,3980,3983,3986,3989],{},[33,3978,3979],{},"Run your site through Google Search Console and fix any reported issues",[33,3981,3982],{},"Test your site on a phone and make sure it works properly",[33,3984,3985],{},"Check that every page has a unique title tag and meta description",[33,3987,3988],{},"Fix broken links and remove dead pages",[33,3990,3991],{},"Make sure your site loads over HTTPS, not HTTP",[108,3993,2473],{"id":2700},[15,3995,3996],{},"Technical problems are like having a shop with a broken door. Everything inside might be fine, but people cannot get in easily.",[52,3998],{},[22,4000,4002],{"id":4001},"_6-you-have-no-backlinks-or-online-presence","6. You Have No Backlinks or Online Presence",[15,4004,4005],{},"Google uses links from other websites as a signal of trust and relevance. If no other website links to yours, Google has less reason to consider you credible.",[15,4007,4008],{},"This does not mean you need hundreds of links. But having zero is a problem, especially in competitive markets.",[108,4010,2434],{"id":3436},[135,4012,4013,4016,4019],{},[33,4014,4015],{},"No other websites mention or link to your business",[33,4017,4018],{},"You have no directory listings, no press mentions, no partnerships online",[33,4020,4021],{},"Your competitors appear on local directories and industry sites but you do not",[108,4023,307],{"id":3398},[135,4025,4026,4029,4032,4035],{},[33,4027,4028],{},"List your business on relevant directories (Google Business Profile, Yelp, industry-specific directories)",[33,4030,4031],{},"Ask suppliers, partners, or clients if they would link to your site",[33,4033,4034],{},"Write something genuinely useful that other people might reference",[33,4036,4037],{},"Get involved in local business communities online",[108,4039,2473],{"id":3418},[15,4041,4042],{},"If nobody else on the internet points to your website, Google treats you like an unknown.",[52,4044],{},[22,4046,4048],{"id":4047},"_7-your-google-business-profile-is-missing-or-incomplete","7. Your Google Business Profile Is Missing or Incomplete",[15,4050,4051],{},"For local businesses, your Google Business Profile (formerly Google My Business) is often the most important factor in appearing in local search results and on Google Maps.",[15,4053,4054],{},"If you have not claimed it, or if the information is incomplete, you are missing one of the easiest wins in local SEO.",[108,4056,2434],{"id":4057},"what-this-looks-like-6",[135,4059,4060,4063,4066],{},[33,4061,4062],{},"Searching your business name does not show a knowledge panel on the right side of Google",[33,4064,4065],{},"Your competitors appear on Google Maps but you do not",[33,4067,4068],{},"Customers say they cannot find you on Google",[108,4070,307],{"id":3453},[135,4072,4073,4082,4085,4088,4091],{},[33,4074,4075,4076,4081],{},"Go to ",[141,4077,4080],{"href":4078,"rel":4079},"https:\u002F\u002Fbusiness.google.com\u002F",[3136],"Google Business Profile"," and claim or create your listing",[33,4083,4084],{},"Fill in every section: address, phone, hours, categories, services, description",[33,4086,4087],{},"Add real photos of your business",[33,4089,4090],{},"Ask satisfied customers to leave reviews",[33,4092,4093],{},"Keep it updated when anything changes",[108,4095,2473],{"id":3473},[15,4097,4098],{},"For local businesses, this is often the single most impactful thing you can do.",[52,4100],{},[22,4102,4104],{"id":4103},"_8-your-competitors-are-simply-doing-more","8. Your Competitors Are Simply Doing More",[15,4106,4107],{},"Sometimes your website is not technically broken. It is just being outworked.",[15,4109,4110],{},"If your competitors have more content, better-optimised pages, more reviews, and more links, Google will naturally prefer them. SEO is relative. You do not need to be perfect, but you do need to be competitive.",[108,4112,2434],{"id":4113},"what-this-looks-like-7",[135,4115,4116,4119,4122],{},[33,4117,4118],{},"Your competitors consistently appear above you",[33,4120,4121],{},"They have more pages, more blog posts, more reviews",[33,4123,4124],{},"Their websites are faster, cleaner, and more detailed",[108,4126,307],{"id":4127},"what-to-do-7",[135,4129,4130,4133,4136,4139],{},[33,4131,4132],{},"Look at what your top three competitors are doing online",[33,4134,4135],{},"Identify where they are stronger and where you could close the gap",[33,4137,4138],{},"Focus on one or two improvements at a time rather than trying to fix everything at once",[33,4140,4141],{},"Be consistent over time rather than expecting overnight results",[108,4143,2473],{"id":4144},"plain-english-takeaway-7",[15,4146,4147],{},"SEO is not a one-time setup. The businesses that keep showing up are usually the ones that keep working at it.",[52,4149],{},[22,4151,4153],{"id":4152},"a-quick-self-audit-checklist","A Quick Self-Audit Checklist",[15,4155,4156],{},"Before spending money on SEO services, run through this yourself:",[135,4158,4160,4169,4175,4184,4190,4196,4202,4208,4214,4220],{"className":4159},[378],[33,4161,4163,4165,4166,4168],{"className":4162},[382],[384,4164],{"disabled":386,"type":387}," Can you find your site with ",[71,4167,3728],{},"?",[33,4170,4172,4174],{"className":4171},[382],[384,4173],{"disabled":386,"type":387}," Have you set up Google Search Console?",[33,4176,4178,4180,4181,4183],{"className":4177},[382],[384,4179],{"disabled":386,"type":387}," Is your ",[71,4182,3809],{}," file allowing Google in?",[33,4185,4187,4189],{"className":4186},[382],[384,4188],{"disabled":386,"type":387}," Does every important page have a clear, unique title?",[33,4191,4193,4195],{"className":4192},[382],[384,4194],{"disabled":386,"type":387}," Do your pages contain enough real, readable text?",[33,4197,4199,4201],{"className":4198},[382],[384,4200],{"disabled":386,"type":387}," Are you using words your customers would actually search for?",[33,4203,4205,4207],{"className":4204},[382],[384,4206],{"disabled":386,"type":387}," Does your site work properly on mobile?",[33,4209,4211,4213],{"className":4210},[382],[384,4212],{"disabled":386,"type":387}," Does your site load in a reasonable time?",[33,4215,4217,4219],{"className":4216},[382],[384,4218],{"disabled":386,"type":387}," Have you claimed your Google Business Profile?",[33,4221,4223,4225],{"className":4222},[382],[384,4224],{"disabled":386,"type":387}," Does any other website link to yours?",[15,4227,4228],{},"If you tick fewer than half of those, you have a clear starting point.",[52,4230],{},[22,4232,4234],{"id":4233},"when-to-get-professional-help","When To Get Professional Help",[15,4236,4237],{},"SEO can be done in stages. You do not need to fix everything at once, and you do not always need an agency.",[15,4239,4240],{},"But if your website is important to your business and you are not getting any search traffic, a focused SEO review can save months of guesswork.",[15,4242,4243],{},"A good developer or SEO specialist should be able to:",[135,4245,4246,4249,4252,4255],{},[33,4247,4248],{},"tell you exactly why Google is not showing your site",[33,4250,4251],{},"prioritise which fixes will make the biggest difference",[33,4253,4254],{},"give you a realistic timeline for results",[33,4256,4257],{},"explain things without jargon",[52,4259],{},[22,4261,433],{"id":432},[15,4263,4264],{},"Most business websites that do not appear on Google are not penalised or blacklisted. They are simply invisible because a few basic things were never set up.",[15,4266,4267],{},"The fixes are usually:",[135,4269,4270,4273,4276,4279,4282],{},[33,4271,4272],{},"tell Google your site exists",[33,4274,4275],{},"make sure nothing is blocking it",[33,4277,4278],{},"write content that matches what people search for",[33,4280,4281],{},"fix any technical issues",[33,4283,4284],{},"build a basic online presence",[15,4286,4287],{},"Start with the checklist above. If your site has been live for months and Google still does not show it, there is almost certainly a fixable reason.",{"title":444,"searchDepth":445,"depth":445,"links":4289},[4290,4291,4292,4297,4302,4307,4312,4317,4322,4327,4332,4333,4334],{"id":24,"depth":445,"text":25},{"id":3716,"depth":445,"text":3717},{"id":3739,"depth":445,"text":3740,"children":4293},[4294,4295,4296],{"id":2433,"depth":452,"text":2434},{"id":306,"depth":452,"text":307},{"id":2472,"depth":452,"text":2473},{"id":3799,"depth":445,"text":3800,"children":4298},[4299,4300,4301],{"id":2491,"depth":452,"text":2434},{"id":2508,"depth":452,"text":307},{"id":2528,"depth":452,"text":2473},{"id":3855,"depth":445,"text":3856,"children":4303},[4304,4305,4306],{"id":2546,"depth":452,"text":2434},{"id":2563,"depth":452,"text":307},{"id":2580,"depth":452,"text":2473},{"id":3901,"depth":445,"text":3902,"children":4308},[4309,4310,4311],{"id":2598,"depth":452,"text":2434},{"id":2619,"depth":452,"text":307},{"id":2636,"depth":452,"text":2473},{"id":3947,"depth":445,"text":3948,"children":4313},[4314,4315,4316],{"id":2654,"depth":452,"text":2434},{"id":2677,"depth":452,"text":307},{"id":2700,"depth":452,"text":2473},{"id":4001,"depth":445,"text":4002,"children":4318},[4319,4320,4321],{"id":3436,"depth":452,"text":2434},{"id":3398,"depth":452,"text":307},{"id":3418,"depth":452,"text":2473},{"id":4047,"depth":445,"text":4048,"children":4323},[4324,4325,4326],{"id":4057,"depth":452,"text":2434},{"id":3453,"depth":452,"text":307},{"id":3473,"depth":452,"text":2473},{"id":4103,"depth":445,"text":4104,"children":4328},[4329,4330,4331],{"id":4113,"depth":452,"text":2434},{"id":4127,"depth":452,"text":307},{"id":4144,"depth":452,"text":2473},{"id":4152,"depth":445,"text":4153},{"id":4233,"depth":445,"text":4234},{"id":432,"depth":445,"text":433},[477],{"title":4337,"titleAccent":480,"description":4338,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":4339,"secondaryButtonLink":4340},"Want your website to actually show up on Google?","If your business website is invisible on Google, I can help you find the problems, fix what matters most, and build a clear path to better search visibility.","View SEO services","\u002Fservices\u002Fseo",{},{"title":3668,"description":4343,"ogImage":444},"A plain-English checklist for business owners wondering why their website does not appear on Google. Covers indexing, content, technical issues, and practical fixes.","blog\u002Fwhy-does-google-not-show-my-business-website",[4346,4347,499,1396],"SEO","Google","MMFNMCGX6uPZxJJTp1LdQ8ArDNKhkXw6-SqQ4-JXnLk",{"id":4350,"title":4351,"author":4352,"body":4353,"categories":4997,"cta":4998,"date":486,"description":4357,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":5002,"navigation":386,"path":143,"readingTime":1750,"seo":5003,"stem":5005,"tags":5006,"__hash__":5008},"blog\u002Fblog\u002Fwhy-does-my-contact-form-stop-working.md","Why Does My Contact Form Stop Working? Common Causes and Easy Fixes",{"name":8,"avatar":9,"description":10},{"type":12,"value":4354,"toc":4954},[4355,4358,4361,4364,4366,4369,4392,4395,4397,4401,4404,4410,4416,4419,4421,4425,4428,4431,4435,4449,4451,4465,4467,4470,4472,4476,4479,4482,4485,4499,4502,4520,4522,4525,4527,4531,4534,4537,4540,4554,4557,4571,4573,4576,4578,4582,4585,4588,4591,4605,4608,4622,4624,4627,4629,4633,4636,4639,4642,4656,4659,4673,4675,4678,4680,4684,4687,4690,4693,4707,4710,4724,4726,4729,4731,4735,4738,4741,4743,4757,4760,4774,4776,4779,4781,4785,4788,4851,4854,4856,4860,4863,4889,4891,4895,4898,4901,4918,4921,4923,4925,4928,4931,4934,4951],[15,4356,4357],{},"Your contact form was working fine. Then one day you realise you have not received an enquiry in weeks. You test it yourself, fill in the form, hit send, and nothing arrives.",[15,4359,4360],{},"This is one of the most common and most damaging website problems a business can have. Unlike a broken layout or a slow page, a broken contact form fails silently. You do not know leads are being lost until it is too late.",[15,4362,4363],{},"The good news is that the cause is almost always one of a handful of known issues.",[22,4365,25],{"id":24},[15,4367,4368],{},"If your contact form has stopped working, it is usually one of these:",[30,4370,4371,4374,4377,4380,4383,4386,4389],{},[33,4372,4373],{},"The form submits but emails are not arriving",[33,4375,4376],{},"Emails are landing in spam or junk",[33,4378,4379],{},"A plugin update or conflict broke something",[33,4381,4382],{},"The destination email address is wrong",[33,4384,4385],{},"Your hosting cannot send emails reliably",[33,4387,4388],{},"CAPTCHA or validation is blocking real users",[33,4390,4391],{},"The form itself has a hidden error",[15,4393,4394],{},"Most of the time, the form is not completely broken. Something in the delivery chain has changed.",[52,4396],{},[22,4398,4400],{"id":4399},"the-two-types-of-not-working","The Two Types of \"Not Working\"",[15,4402,4403],{},"Before troubleshooting, it helps to know which type of problem you have:",[15,4405,4406,4409],{},[91,4407,4408],{},"Type 1: The form submits but the email never arrives."," The visitor fills in the form, clicks send, and sees a success message. But the email never reaches your inbox. This is the most common scenario.",[15,4411,4412,4415],{},[91,4413,4414],{},"Type 2: The form itself does not work."," The visitor tries to submit but gets an error, the page reloads, or nothing happens. This is usually a code or plugin issue.",[15,4417,4418],{},"Most of this article focuses on Type 1 because it is the one that causes the most damage. The form appears to work, so nobody notices the problem until leads have already been lost.",[52,4420],{},[22,4422,4424],{"id":4423},"_1-the-form-submits-but-emails-are-not-arriving","1. The Form Submits But Emails Are Not Arriving",[15,4426,4427],{},"This is the most common pattern.",[15,4429,4430],{},"Your form processes the submission correctly. The visitor sees a \"thank you\" message. But somewhere between the form and your inbox, the email disappears.",[108,4432,4434],{"id":4433},"why-this-happens","Why this happens",[135,4436,4437,4440,4443,4446],{},[33,4438,4439],{},"Your web server sends the email, but your email provider rejects or filters it",[33,4441,4442],{},"The email is sent from an address that does not match your domain",[33,4444,4445],{},"Your hosting provider has restrictions on outgoing email",[33,4447,4448],{},"The email is being silently dropped by a spam filter you cannot see",[108,4450,1963],{"id":1962},[135,4452,4453,4456,4459,4462],{},[33,4454,4455],{},"Look in your spam and junk folders carefully",[33,4457,4458],{},"Check whether the form has a notification log or submission history",[33,4460,4461],{},"Try changing the destination email address temporarily",[33,4463,4464],{},"Ask your hosting provider whether outgoing emails are being blocked",[108,4466,2473],{"id":2472},[15,4468,4469],{},"The form might be doing its job. The email is just not making it through.",[52,4471],{},[22,4473,4475],{"id":4474},"_2-emails-are-landing-in-spam-or-junk","2. Emails Are Landing in Spam or Junk",[15,4477,4478],{},"This is closely related to the first issue but worth separating because the fix is different.",[15,4480,4481],{},"When your website sends an email, it often comes from the server itself rather than from a proper email account. Email providers like Gmail, Outlook, and Yahoo treat these messages with suspicion because they cannot verify who really sent them.",[108,4483,4434],{"id":4484},"why-this-happens-1",[135,4486,4487,4490,4493,4496],{},[33,4488,4489],{},"Your domain does not have SPF, DKIM, or DMARC records set up",[33,4491,4492],{},"The email is sent from a generic or mismatched address",[33,4494,4495],{},"The email content triggers spam filters (too many links, certain words)",[33,4497,4498],{},"Your server shares an IP address with other sites that send spam",[108,4500,1963],{"id":4501},"what-to-check-1",[135,4503,4504,4507,4514,4517],{},[33,4505,4506],{},"Search your spam folder for the form sender address",[33,4508,4509,4510,4513],{},"Ask your developer whether ",[141,4511,4512],{"href":1797},"email authentication records"," are configured",[33,4515,4516],{},"Check if the \"from\" address on your form matches your actual domain",[33,4518,4519],{},"Consider using a dedicated email sending service like SMTP",[108,4521,2473],{"id":2528},[15,4523,4524],{},"Your form emails might be arriving. They are just being put somewhere you are not looking.",[52,4526],{},[22,4528,4530],{"id":4529},"_3-a-plugin-update-or-conflict-broke-something","3. A Plugin Update or Conflict Broke Something",[15,4532,4533],{},"If your site runs on WordPress or a similar platform, plugin updates can silently break your contact form.",[15,4535,4536],{},"This can happen when the form plugin itself updates, when another plugin conflicts with it, or when a PHP or server update changes how things work behind the scenes.",[108,4538,4434],{"id":4539},"why-this-happens-2",[135,4541,4542,4545,4548,4551],{},[33,4543,4544],{},"The form plugin updated and introduced a bug",[33,4546,4547],{},"Another plugin conflicts with the form's submission process",[33,4549,4550],{},"A server or PHP update changed behaviour the plugin depends on",[33,4552,4553],{},"The form relies on a feature that was removed or changed",[108,4555,1963],{"id":4556},"what-to-check-2",[135,4558,4559,4562,4565,4568],{},[33,4560,4561],{},"Check when the form last worked and whether any updates happened around that time",[33,4563,4564],{},"Try deactivating other plugins temporarily to see if the form starts working",[33,4566,4567],{},"Check the form plugin's settings for any error messages or warnings",[33,4569,4570],{},"Look at the plugin's changelog or support forum for known issues",[108,4572,2473],{"id":2580},[15,4574,4575],{},"If the form used to work and nothing obvious changed, a plugin update is one of the first things to investigate.",[52,4577],{},[22,4579,4581],{"id":4580},"_4-the-destination-email-address-is-wrong","4. The Destination Email Address Is Wrong",[15,4583,4584],{},"This sounds too simple, but it happens more often than people admit.",[15,4586,4587],{},"Someone updates the form settings, changes a company email, or migrates to a new email provider and forgets to update the contact form destination.",[108,4589,4434],{"id":4590},"why-this-happens-3",[135,4592,4593,4596,4599,4602],{},[33,4594,4595],{},"The email address in the form settings was changed or misspelled",[33,4597,4598],{},"The company switched email providers but did not update the form",[33,4600,4601],{},"Multiple forms exist and only some were updated",[33,4603,4604],{},"A staging or test email address was left in place",[108,4606,1963],{"id":4607},"what-to-check-3",[135,4609,4610,4613,4616,4619],{},[33,4611,4612],{},"Open your form settings and verify the exact email address",[33,4614,4615],{},"Send a test email directly to that address to confirm it works",[33,4617,4618],{},"Check if there are multiple notification rules and whether all addresses are correct",[33,4620,4621],{},"Look for typos, extra spaces, or old email domains",[108,4623,2473],{"id":2636},[15,4625,4626],{},"Before investigating anything complicated, double-check the basics.",[52,4628],{},[22,4630,4632],{"id":4631},"_5-your-hosting-cannot-send-emails-reliably","5. Your Hosting Cannot Send Emails Reliably",[15,4634,4635],{},"Many shared hosting providers limit or restrict outgoing emails.",[15,4637,4638],{},"They do this to prevent spam, but it also affects legitimate emails from your contact form. Some hosts block certain sending methods entirely, while others throttle the number of emails you can send per hour.",[108,4640,4434],{"id":4641},"why-this-happens-4",[135,4643,4644,4647,4650,4653],{},[33,4645,4646],{},"Your host limits outgoing emails per hour or per day",[33,4648,4649],{},"The server's IP address has been flagged for spam by other users on the same server",[33,4651,4652],{},"Your host disabled the PHP mail function",[33,4654,4655],{},"Email sending requires specific configuration your form does not use",[108,4657,1963],{"id":4658},"what-to-check-4",[135,4660,4661,4664,4667,4670],{},[33,4662,4663],{},"Ask your hosting provider whether there are any restrictions on outgoing email",[33,4665,4666],{},"Check whether other email features on your site are also affected",[33,4668,4669],{},"Look into using an SMTP plugin or external email service to bypass server email",[33,4671,4672],{},"Check your hosting control panel for any email-related error logs",[108,4674,2473],{"id":2700},[15,4676,4677],{},"If your hosting is cheap and shared, it may not be reliable enough to deliver form emails consistently.",[52,4679],{},[22,4681,4683],{"id":4682},"_6-captcha-or-validation-is-blocking-real-users","6. CAPTCHA or Validation Is Blocking Real Users",[15,4685,4686],{},"Anti-spam measures are important, but overly aggressive settings can prevent genuine visitors from submitting the form.",[15,4688,4689],{},"An expired CAPTCHA, an invisible reCAPTCHA that fails silently, or strict validation rules on phone numbers and postcodes can all stop real enquiries from getting through.",[108,4691,4434],{"id":4692},"why-this-happens-5",[135,4694,4695,4698,4701,4704],{},[33,4696,4697],{},"reCAPTCHA keys have expired or are misconfigured",[33,4699,4700],{},"The CAPTCHA challenge is too difficult or broken on certain devices",[33,4702,4703],{},"Required fields have validation rules that reject legitimate input",[33,4705,4706],{},"Anti-spam plugins are too aggressive and flagging real submissions",[108,4708,1963],{"id":4709},"what-to-check-5",[135,4711,4712,4715,4718,4721],{},[33,4713,4714],{},"Submit a test form yourself on both desktop and mobile",[33,4716,4717],{},"Try different browsers and devices",[33,4719,4720],{},"Check whether CAPTCHA is showing errors in the browser console",[33,4722,4723],{},"Temporarily disable anti-spam features to see if submissions start arriving",[108,4725,2473],{"id":3418},[15,4727,4728],{},"If your form is stopping real users from submitting, you are losing leads even though the form technically \"works\".",[52,4730],{},[22,4732,4734],{"id":4733},"_7-the-form-has-a-hidden-error","7. The Form Has a Hidden Error",[15,4736,4737],{},"Sometimes the form itself has a bug that prevents submission but does not show a clear error message to the visitor.",[15,4739,4740],{},"This can happen with JavaScript errors, broken AJAX submissions, or CSS issues that hide the submit button or error messages.",[108,4742,2434],{"id":2433},[135,4744,4745,4748,4751,4754],{},[33,4746,4747],{},"The submit button does nothing when clicked",[33,4749,4750],{},"The page reloads but no confirmation appears",[33,4752,4753],{},"The form seems to work on desktop but fails on mobile",[33,4755,4756],{},"There is a brief loading animation that never resolves",[108,4758,1963],{"id":4759},"what-to-check-6",[135,4761,4762,4765,4768,4771],{},[33,4763,4764],{},"Open your browser's developer console (F12) and look for red error messages",[33,4766,4767],{},"Test the form in a private or incognito window",[33,4769,4770],{},"Check whether ad blockers or browser extensions are interfering",[33,4772,4773],{},"Try the form on a different device or browser",[108,4775,2473],{"id":3473},[15,4777,4778],{},"If the form does not respond at all, there is likely a code error that needs a developer to diagnose.",[52,4780],{},[22,4782,4784],{"id":4783},"quick-troubleshooting-checklist","Quick Troubleshooting Checklist",[15,4786,4787],{},"Run through this before contacting a developer:",[135,4789,4791,4797,4803,4809,4815,4821,4827,4833,4839,4845],{"className":4790},[378],[33,4792,4794,4796],{"className":4793},[382],[384,4795],{"disabled":386,"type":387}," Check your spam and junk folders for form emails",[33,4798,4800,4802],{"className":4799},[382],[384,4801],{"disabled":386,"type":387}," Verify the destination email address in the form settings",[33,4804,4806,4808],{"className":4805},[382],[384,4807],{"disabled":386,"type":387}," Submit a test form yourself on desktop and mobile",[33,4810,4812,4814],{"className":4811},[382],[384,4813],{"disabled":386,"type":387}," Check if the form shows a success message after submission",[33,4816,4818,4820],{"className":4817},[382],[384,4819],{"disabled":386,"type":387}," Look for a submission log or entry history in your form plugin",[33,4822,4824,4826],{"className":4823},[382],[384,4825],{"disabled":386,"type":387}," Check whether any plugins or themes were recently updated",[33,4828,4830,4832],{"className":4829},[382],[384,4831],{"disabled":386,"type":387}," Try deactivating other plugins temporarily",[33,4834,4836,4838],{"className":4835},[382],[384,4837],{"disabled":386,"type":387}," Ask your hosting provider about email sending restrictions",[33,4840,4842,4844],{"className":4841},[382],[384,4843],{"disabled":386,"type":387}," Test with a different email address as the destination",[33,4846,4848,4850],{"className":4847},[382],[384,4849],{"disabled":386,"type":387}," Check whether CAPTCHA or anti-spam settings are too strict",[15,4852,4853],{},"If the form has a submission log showing entries but you are not receiving emails, the problem is email delivery. If the log is empty, the form itself is not processing submissions.",[52,4855],{},[22,4857,4859],{"id":4858},"how-to-avoid-losing-leads-silently","How To Avoid Losing Leads Silently",[15,4861,4862],{},"The worst thing about a broken contact form is that you might not notice for weeks. Here are practical steps to prevent that:",[135,4864,4865,4871,4877,4883],{},[33,4866,4867,4870],{},[91,4868,4869],{},"Set up a submission log."," Use a form plugin that stores submissions in your website's database, not just via email. This gives you a backup.",[33,4872,4873,4876],{},[91,4874,4875],{},"Send yourself a test submission regularly."," Once a month, fill in your own form and check that the email arrives.",[33,4878,4879,4882],{},[91,4880,4881],{},"Use an external email service."," Services like SendGrid, Mailgun, or Amazon SES are more reliable than server-based email and give you delivery tracking.",[33,4884,4885,4888],{},[91,4886,4887],{},"Set up a simple alert."," If you normally receive a few enquiries per week and suddenly receive none, that should be a red flag.",[52,4890],{},[22,4892,4894],{"id":4893},"when-to-get-a-developer-involved","When To Get A Developer Involved",[15,4896,4897],{},"If your contact form is critical to your business and the quick checks above did not solve the problem, it is worth getting professional help.",[15,4899,4900],{},"A developer should be able to:",[135,4902,4903,4906,4909,4912,4915],{},[33,4904,4905],{},"identify whether the problem is the form, the email delivery, or the server",[33,4907,4908],{},"set up reliable email delivery using SMTP or an external service",[33,4910,4911],{},"configure email authentication records (SPF, DKIM, DMARC)",[33,4913,4914],{},"set up submission logging so you never lose leads silently again",[33,4916,4917],{},"put monitoring in place so you know immediately if something breaks",[15,4919,4920],{},"A broken contact form is not just a technical inconvenience. Every day it stays broken is a day of lost business.",[52,4922],{},[22,4924,433],{"id":432},[15,4926,4927],{},"Most contact form problems are not dramatic failures. They are quiet ones.",[15,4929,4930],{},"The form looks fine. Visitors fill it in. The success message appears. But the email never arrives and nobody knows until a customer asks why nobody replied.",[15,4932,4933],{},"The fixes are usually straightforward:",[135,4935,4936,4939,4942,4945,4948],{},[33,4937,4938],{},"check spam folders",[33,4940,4941],{},"verify the destination address",[33,4943,4944],{},"fix plugin conflicts",[33,4946,4947],{},"set up proper email delivery",[33,4949,4950],{},"add a submission log as a safety net",[15,4952,4953],{},"Start with the checklist above. If your form has been unreliable, there is almost always a fixable reason.",{"title":444,"searchDepth":445,"depth":445,"links":4955},[4956,4957,4958,4963,4968,4973,4978,4983,4988,4993,4994,4995,4996],{"id":24,"depth":445,"text":25},{"id":4399,"depth":445,"text":4400},{"id":4423,"depth":445,"text":4424,"children":4959},[4960,4961,4962],{"id":4433,"depth":452,"text":4434},{"id":1962,"depth":452,"text":1963},{"id":2472,"depth":452,"text":2473},{"id":4474,"depth":445,"text":4475,"children":4964},[4965,4966,4967],{"id":4484,"depth":452,"text":4434},{"id":4501,"depth":452,"text":1963},{"id":2528,"depth":452,"text":2473},{"id":4529,"depth":445,"text":4530,"children":4969},[4970,4971,4972],{"id":4539,"depth":452,"text":4434},{"id":4556,"depth":452,"text":1963},{"id":2580,"depth":452,"text":2473},{"id":4580,"depth":445,"text":4581,"children":4974},[4975,4976,4977],{"id":4590,"depth":452,"text":4434},{"id":4607,"depth":452,"text":1963},{"id":2636,"depth":452,"text":2473},{"id":4631,"depth":445,"text":4632,"children":4979},[4980,4981,4982],{"id":4641,"depth":452,"text":4434},{"id":4658,"depth":452,"text":1963},{"id":2700,"depth":452,"text":2473},{"id":4682,"depth":445,"text":4683,"children":4984},[4985,4986,4987],{"id":4692,"depth":452,"text":4434},{"id":4709,"depth":452,"text":1963},{"id":3418,"depth":452,"text":2473},{"id":4733,"depth":445,"text":4734,"children":4989},[4990,4991,4992],{"id":2433,"depth":452,"text":2434},{"id":4759,"depth":452,"text":1963},{"id":3473,"depth":452,"text":2473},{"id":4783,"depth":445,"text":4784},{"id":4858,"depth":445,"text":4859},{"id":4893,"depth":445,"text":4894},{"id":432,"depth":445,"text":433},[477],{"title":4999,"titleAccent":5000,"description":5001,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":484,"secondaryButtonLink":485},"Losing leads because your form is broken?","Let's fix it.","If your contact form is not working and you are missing enquiries, I can diagnose the problem, get it working again, and set up monitoring so it does not happen silently.",{},{"title":4351,"description":5004,"ogImage":444},"A simple troubleshooting guide for business owners whose website contact form has stopped sending emails. Covers spam filters, plugin conflicts, hosting issues, and practical fixes.","blog\u002Fwhy-does-my-contact-form-stop-working",[5007,3664,499,874],"contact forms","vt4KLQiBiKjCw9Aw6dmorwp28nwSUB6UXfFKRVdlZYA",{"id":5010,"title":5011,"author":5012,"body":5013,"categories":5594,"cta":5595,"date":486,"description":5017,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":5598,"navigation":386,"path":1437,"readingTime":1750,"seo":5599,"stem":5601,"tags":5602,"__hash__":5605},"blog\u002Fblog\u002Fwhy-does-my-site-look-broken-on-mobile.md","Why Does My Site Look Broken on Mobile? The Most Common Non-Technical Causes",{"name":8,"avatar":9,"description":10},{"type":12,"value":5014,"toc":5552},[5015,5018,5021,5024,5026,5029,5052,5055,5057,5061,5064,5067,5070,5072,5076,5079,5082,5084,5098,5100,5111,5113,5116,5118,5122,5125,5128,5130,5144,5146,5160,5162,5165,5167,5171,5174,5177,5179,5193,5195,5209,5211,5214,5216,5220,5223,5226,5228,5242,5244,5261,5263,5266,5268,5272,5275,5278,5280,5294,5296,5310,5312,5315,5317,5321,5324,5327,5329,5343,5345,5359,5361,5364,5366,5370,5373,5380,5382,5399,5401,5418,5420,5423,5425,5429,5432,5483,5486,5488,5492,5495,5498,5515,5522,5524,5526,5529,5532,5549],[15,5016,5017],{},"You open your website on your phone and something is wrong. Text is overflowing. Images are cut off. Buttons are impossible to tap. The menu covers the whole screen and will not close.",[15,5019,5020],{},"It looked perfectly fine on your laptop. So what happened?",[15,5022,5023],{},"This is one of the most common complaints business owners have, and the causes are usually not mysterious. Most mobile layout problems come from a small number of predictable issues.",[22,5025,25],{"id":24},[15,5027,5028],{},"If your website looks broken on mobile, it is usually one of these:",[30,5030,5031,5034,5037,5040,5043,5046,5049],{},[33,5032,5033],{},"The site was designed for desktop first and mobile was an afterthought",[33,5035,5036],{},"Text is too small or too wide to read comfortably",[33,5038,5039],{},"Images and banners are not scaling properly",[33,5041,5042],{},"Popups or overlays are covering the screen",[33,5044,5045],{},"Menus and buttons are too small or too close together",[33,5047,5048],{},"An old theme or page builder is causing layout problems",[33,5050,5051],{},"The page has too many moving parts",[15,5053,5054],{},"Most of the time, it is not one catastrophic failure. It is a combination of things that feel fine on a big screen but fall apart on a small one.",[52,5056],{},[22,5058,5060],{"id":5059},"why-desktop-and-mobile-can-look-so-different","Why Desktop and Mobile Can Look So Different",[15,5062,5063],{},"A desktop monitor is typically 1200 to 1920 pixels wide. A phone screen is around 360 to 430 pixels wide. That is roughly a quarter of the space.",[15,5065,5066],{},"Everything that fits neatly on a wide screen has to rearrange itself to fit on a narrow one. Columns have to stack. Images have to shrink. Navigation has to collapse. If the website was not built with this in mind, things break.",[15,5068,5069],{},"A \"responsive\" website is one that adapts its layout automatically depending on the screen size. If your site is not responsive, or if the responsive behaviour was poorly implemented, mobile users will see problems that desktop users never notice.",[52,5071],{},[22,5073,5075],{"id":5074},"_1-the-site-was-designed-for-desktop-and-mobile-was-an-afterthought","1. The Site Was Designed for Desktop and Mobile Was an Afterthought",[15,5077,5078],{},"This is the root cause of most mobile issues.",[15,5080,5081],{},"Many websites are designed and reviewed on a laptop or desktop monitor. The client approves the design on a big screen. Nobody checks what it looks like on a phone until it is already live.",[108,5083,2434],{"id":2433},[135,5085,5086,5089,5092,5095],{},[33,5087,5088],{},"The desktop version looks polished but the mobile version feels like a broken version of the same page",[33,5090,5091],{},"Content is squeezed or cut off rather than properly rearranged",[33,5093,5094],{},"Some sections look fine and others are clearly wrong",[33,5096,5097],{},"The site was built several years ago when mobile traffic was lower",[108,5099,307],{"id":306},[135,5101,5102,5105,5108],{},[33,5103,5104],{},"Check your analytics to see what percentage of visitors use mobile (for most businesses, it is over 50%)",[33,5106,5107],{},"Test every important page on an actual phone, not just a browser resize",[33,5109,5110],{},"If the gap between desktop and mobile quality is large, the site may need responsive improvements rather than small fixes",[108,5112,2473],{"id":2472},[15,5114,5115],{},"If mobile was never a priority during the build, the problems are baked into the design. Small patches may not be enough.",[52,5117],{},[22,5119,5121],{"id":5120},"_2-text-is-too-small-or-too-wide","2. Text Is Too Small or Too Wide",[15,5123,5124],{},"On mobile, text needs to be large enough to read without zooming and narrow enough that you do not have to scroll sideways.",[15,5126,5127],{},"If your text is tiny, users will pinch to zoom and lose their place. If lines of text run too wide, they will have to scroll horizontally on every line, which is exhausting.",[108,5129,2434],{"id":2491},[135,5131,5132,5135,5138,5141],{},[33,5133,5134],{},"You have to pinch and zoom to read anything",[33,5136,5137],{},"Text runs off the edge of the screen",[33,5139,5140],{},"Paragraphs are very wide with no breathing room on the sides",[33,5142,5143],{},"Font sizes that look fine on desktop become unreadable on mobile",[108,5145,307],{"id":2508},[135,5147,5148,5151,5154,5157],{},[33,5149,5150],{},"Check that your site uses a meta viewport tag (your developer will know what this means)",[33,5152,5153],{},"Make sure body text is at least 16 pixels on mobile",[33,5155,5156],{},"Check that text containers have proper padding so words do not touch the edges",[33,5158,5159],{},"Avoid fixed-width containers that do not adapt to smaller screens",[108,5161,2473],{"id":2528},[15,5163,5164],{},"If people have to zoom in to read your website, they will leave instead.",[52,5166],{},[22,5168,5170],{"id":5169},"_3-images-and-banners-are-not-scaling","3. Images and Banners Are Not Scaling",[15,5172,5173],{},"Large hero images, banners, and product photos that look great on desktop can cause serious problems on mobile.",[15,5175,5176],{},"An image that is 1400 pixels wide will either overflow the screen, get cropped awkwardly, or force the browser to shrink everything else around it.",[108,5178,2434],{"id":2546},[135,5180,5181,5184,5187,5190],{},[33,5182,5183],{},"Images stretch beyond the screen edges",[33,5185,5186],{},"Banners with text are unreadable because the text shrinks with the image",[33,5188,5189],{},"Product photos are cropped in unexpected places",[33,5191,5192],{},"The page feels wider than the screen, causing horizontal scrolling",[108,5194,307],{"id":2563},[135,5196,5197,5200,5203,5206],{},[33,5198,5199],{},"Make sure all images use responsive CSS (max-width: 100%)",[33,5201,5202],{},"Avoid text baked into images because it will not scale properly",[33,5204,5205],{},"Use different image sizes for different screen sizes where possible",[33,5207,5208],{},"Check that banner text is actual HTML text overlaid on the image, not part of the image file",[108,5210,2473],{"id":2580},[15,5212,5213],{},"If your images were not built to adapt, they will be the first thing that breaks on a small screen.",[52,5215],{},[22,5217,5219],{"id":5218},"_4-popups-are-covering-the-screen","4. Popups Are Covering the Screen",[15,5221,5222],{},"A popup that takes up a small portion of a desktop screen can completely cover a mobile screen.",[15,5224,5225],{},"Cookie banners, newsletter popups, promotional overlays, and chat widgets are all common offenders. On mobile, they can make the page unusable because there is no room to dismiss them or interact with the content underneath.",[108,5227,2434],{"id":2598},[135,5229,5230,5233,5236,5239],{},[33,5231,5232],{},"A popup covers the entire phone screen",[33,5234,5235],{},"The close button is hidden, tiny, or pushed off-screen",[33,5237,5238],{},"Multiple overlays stack on top of each other",[33,5240,5241],{},"The page is impossible to use until the popup is dismissed",[108,5243,307],{"id":2619},[135,5245,5246,5249,5252,5255,5258],{},[33,5247,5248],{},"Test every popup and overlay on a real phone",[33,5250,5251],{},"Make sure close buttons are large enough and clearly visible on mobile",[33,5253,5254],{},"Consider delaying popups on mobile or using less intrusive formats",[33,5256,5257],{},"Check that cookie banners are usable on small screens",[33,5259,5260],{},"Google penalises intrusive interstitials on mobile, so this also affects your search rankings",[108,5262,2473],{"id":2636},[15,5264,5265],{},"If your popup blocks the whole screen on a phone, visitors will leave before they ever see your content.",[52,5267],{},[22,5269,5271],{"id":5270},"_5-menus-and-buttons-are-too-small-or-too-close-together","5. Menus and Buttons Are Too Small or Too Close Together",[15,5273,5274],{},"Fingers are bigger than mouse cursors. What works as a clickable link on desktop can be nearly impossible to tap accurately on a phone.",[15,5276,5277],{},"Small buttons, links packed tightly together, and dropdown menus designed for hover interactions all fail on touchscreens.",[108,5279,2434],{"id":2654},[135,5281,5282,5285,5288,5291],{},[33,5283,5284],{},"You tap one link and hit the one next to it",[33,5286,5287],{},"Menu items are too close together to select accurately",[33,5289,5290],{},"Buttons are too small to tap comfortably",[33,5292,5293],{},"Dropdown menus flicker or do not open properly on touch",[108,5295,307],{"id":2677},[135,5297,5298,5301,5304,5307],{},[33,5299,5300],{},"Make sure tap targets are at least 44 by 44 pixels (Apple's recommended minimum)",[33,5302,5303],{},"Add spacing between links and buttons",[33,5305,5306],{},"Replace hover-based menus with tap-friendly alternatives on mobile",[33,5308,5309],{},"Test navigation on a real phone using your thumb, not just your eyes",[108,5311,2473],{"id":2700},[15,5313,5314],{},"If your buttons are hard to tap, your mobile visitors are fighting your website instead of using it.",[52,5316],{},[22,5318,5320],{"id":5319},"_6-an-old-theme-or-page-builder-is-causing-problems","6. An Old Theme or Page Builder Is Causing Problems",[15,5322,5323],{},"If your site was built with a theme or page builder from several years ago, it may not handle modern mobile screens well.",[15,5325,5326],{},"Older themes were often built when mobile traffic was a smaller percentage of total visits. Page builders from that era sometimes generate rigid layouts that do not flex properly on smaller screens.",[108,5328,2434],{"id":3436},[135,5330,5331,5334,5337,5340],{},[33,5332,5333],{},"The site uses a theme that has not been updated in years",[33,5335,5336],{},"The page builder creates fixed-width sections that do not collapse",[33,5338,5339],{},"Mobile layout is clearly an afterthought in the theme's design",[33,5341,5342],{},"Updates to the theme or builder have introduced new bugs",[108,5344,307],{"id":3398},[135,5346,5347,5350,5353,5356],{},[33,5348,5349],{},"Check when your theme was last updated and whether it is still maintained",[33,5351,5352],{},"Look at the theme's demo site on a phone to see if mobile is properly supported",[33,5354,5355],{},"Consider whether the theme or builder is the bottleneck and whether switching would solve multiple problems",[33,5357,5358],{},"If the theme is outdated but the content is good, a rebuild with a modern theme may be more efficient than patching",[108,5360,2473],{"id":3418},[15,5362,5363],{},"An old theme can hold back your entire mobile experience. Sometimes the tool itself is the problem.",[52,5365],{},[22,5367,5369],{"id":5368},"_7-the-page-has-too-many-moving-parts","7. The Page Has Too Many Moving Parts",[15,5371,5372],{},"Animations, sliders, parallax effects, background videos, auto-playing carousels, and floating elements can all cause layout issues on mobile.",[15,5374,5375,5376,5379],{},"These features are often designed for desktop and either break, overlap, or ",[141,5377,5378],{"href":849},"slow the page down"," on phones.",[108,5381,2434],{"id":4057},[135,5383,5384,5387,5390,5393,5396],{},[33,5385,5386],{},"Elements overlap or stack incorrectly on mobile",[33,5388,5389],{},"Animations make the page feel janky or slow",[33,5391,5392],{},"Sliders are too small to interact with on a phone",[33,5394,5395],{},"Background videos waste data and battery",[33,5397,5398],{},"The page feels cluttered and overwhelming on a small screen",[108,5400,307],{"id":3453},[135,5402,5403,5406,5409,5412,5415],{},[33,5404,5405],{},"Disable or simplify animations on mobile",[33,5407,5408],{},"Replace sliders with static content or a single strong image",[33,5410,5411],{},"Remove background videos on mobile devices",[33,5413,5414],{},"Reduce the number of visual effects on important pages",[33,5416,5417],{},"Ask yourself whether each element adds value on a 400-pixel-wide screen",[108,5419,2473],{"id":3473},[15,5421,5422],{},"What looks impressive on a big screen can become a mess on a small one. Less is usually more on mobile.",[52,5424],{},[22,5426,5428],{"id":5427},"a-quick-mobile-self-check","A Quick Mobile Self-Check",[15,5430,5431],{},"Before spending money on fixes, run through this yourself:",[135,5433,5435,5441,5447,5453,5459,5465,5471,5477],{"className":5434},[378],[33,5436,5438,5440],{"className":5437},[382],[384,5439],{"disabled":386,"type":387}," Open your site on your phone using mobile data",[33,5442,5444,5446],{"className":5443},[382],[384,5445],{"disabled":386,"type":387}," Can you read the text without zooming?",[33,5448,5450,5452],{"className":5449},[382],[384,5451],{"disabled":386,"type":387}," Do images fit within the screen without horizontal scrolling?",[33,5454,5456,5458],{"className":5455},[382],[384,5457],{"disabled":386,"type":387}," Can you tap buttons and menu items without hitting the wrong one?",[33,5460,5462,5464],{"className":5461},[382],[384,5463],{"disabled":386,"type":387}," Do popups and banners have a visible, easy-to-reach close button?",[33,5466,5468,5470],{"className":5467},[382],[384,5469],{"disabled":386,"type":387}," Does the navigation menu open and close properly?",[33,5472,5474,5476],{"className":5473},[382],[384,5475],{"disabled":386,"type":387}," Do all important pages load and display correctly?",[33,5478,5480,5482],{"className":5479},[382],[384,5481],{"disabled":386,"type":387}," Is the page usable within the first few seconds, or do you have to wait?",[15,5484,5485],{},"If three or more of those are a problem, your mobile experience needs attention.",[52,5487],{},[22,5489,5491],{"id":5490},"when-a-redesign-is-the-right-fix","When a Redesign Is the Right Fix",[15,5493,5494],{},"Sometimes the mobile issues are too deep to fix with patches. If the theme is old, the page builder is rigid, and the layout was never designed for mobile, individual fixes can take longer and cost more than starting fresh with a responsive foundation.",[15,5496,5497],{},"A redesign makes sense when:",[135,5499,5500,5503,5506,5509,5512],{},[33,5501,5502],{},"the site is more than four or five years old",[33,5504,5505],{},"the theme or builder is no longer maintained",[33,5507,5508],{},"mobile traffic is high but conversion is low",[33,5510,5511],{},"fixing one thing keeps breaking another",[33,5513,5514],{},"the desktop version also needs a refresh",[15,5516,5517,5518,5521],{},"You do not always need a full redesign. Sometimes a focused ",[141,5519,5520],{"href":575},"rebuild of key pages"," is enough to fix the mobile experience without starting everything from scratch.",[52,5523],{},[22,5525,433],{"id":432},[15,5527,5528],{},"Most mobile layout problems are not caused by broken code. They are caused by design decisions that did not account for small screens.",[15,5530,5531],{},"The usual culprits are:",[135,5533,5534,5537,5540,5543,5546],{},[33,5535,5536],{},"images that do not scale",[33,5538,5539],{},"text that is too small or too wide",[33,5541,5542],{},"popups that cover the screen",[33,5544,5545],{},"buttons that are impossible to tap",[33,5547,5548],{},"themes and builders that were never built for mobile",[15,5550,5551],{},"Start by testing your own site on your phone. If you would not enjoy using it as a customer, your visitors probably do not either.",{"title":444,"searchDepth":445,"depth":445,"links":5553},[5554,5555,5556,5561,5566,5571,5576,5581,5586,5591,5592,5593],{"id":24,"depth":445,"text":25},{"id":5059,"depth":445,"text":5060},{"id":5074,"depth":445,"text":5075,"children":5557},[5558,5559,5560],{"id":2433,"depth":452,"text":2434},{"id":306,"depth":452,"text":307},{"id":2472,"depth":452,"text":2473},{"id":5120,"depth":445,"text":5121,"children":5562},[5563,5564,5565],{"id":2491,"depth":452,"text":2434},{"id":2508,"depth":452,"text":307},{"id":2528,"depth":452,"text":2473},{"id":5169,"depth":445,"text":5170,"children":5567},[5568,5569,5570],{"id":2546,"depth":452,"text":2434},{"id":2563,"depth":452,"text":307},{"id":2580,"depth":452,"text":2473},{"id":5218,"depth":445,"text":5219,"children":5572},[5573,5574,5575],{"id":2598,"depth":452,"text":2434},{"id":2619,"depth":452,"text":307},{"id":2636,"depth":452,"text":2473},{"id":5270,"depth":445,"text":5271,"children":5577},[5578,5579,5580],{"id":2654,"depth":452,"text":2434},{"id":2677,"depth":452,"text":307},{"id":2700,"depth":452,"text":2473},{"id":5319,"depth":445,"text":5320,"children":5582},[5583,5584,5585],{"id":3436,"depth":452,"text":2434},{"id":3398,"depth":452,"text":307},{"id":3418,"depth":452,"text":2473},{"id":5368,"depth":445,"text":5369,"children":5587},[5588,5589,5590],{"id":4057,"depth":452,"text":2434},{"id":3453,"depth":452,"text":307},{"id":3473,"depth":452,"text":2473},{"id":5427,"depth":445,"text":5428},{"id":5490,"depth":445,"text":5491},{"id":432,"depth":445,"text":433},[477],{"title":5596,"titleAccent":480,"description":5597,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":1179,"secondaryButtonLink":575},"Is your website letting you down on mobile?","If your site looks broken on phones and you are losing visitors because of it, I can identify the problems and get your mobile experience working properly.",{},{"title":5011,"description":5600,"ogImage":444},"A simple guide for business owners whose website looks broken, messy, or unusable on phones. Covers layout issues, images, popups, menus, and practical fixes.","blog\u002Fwhy-does-my-site-look-broken-on-mobile",[5603,5604,499,3664],"mobile","responsive design","7QkrwI_bq8SUUEoq0xAaNbzhT7Qfx3RMe_O-cJO6Nv4",{"id":5607,"title":5608,"author":5609,"body":5610,"categories":6144,"cta":6145,"date":486,"description":5614,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":6149,"navigation":386,"path":849,"readingTime":491,"seo":6150,"stem":6152,"tags":6153,"__hash__":6154},"blog\u002Fblog\u002Fwhy-is-my-website-slow-7-simple-things-that-usually-cause-it.md","Why Is My Website Slow? 7 Simple Things That Usually Cause It",{"name":8,"avatar":9,"description":10},{"type":12,"value":5611,"toc":6102},[5612,5615,5618,5621,5623,5626,5652,5655,5657,5661,5664,5681,5684,5686,5690,5693,5696,5698,5709,5711,5722,5724,5727,5729,5733,5736,5739,5745,5747,5758,5760,5771,5773,5776,5778,5782,5785,5788,5790,5801,5803,5814,5816,5823,5825,5829,5832,5835,5837,5848,5850,5861,5863,5866,5868,5872,5875,5878,5880,5891,5893,5904,5906,5909,5911,5915,5918,5921,5923,5934,5936,5947,5949,5952,5954,5958,5961,5964,5967,5969,5980,5982,5993,5995,6002,6004,6008,6011,6031,6034,6036,6038,6041,6044,6058,6065,6072,6074,6076,6079,6082,6099],[15,5613,5614],{},"A slow website usually does not mean your whole site is broken. Most of the time, it means one or two avoidable things are dragging it down.",[15,5616,5617],{},"If you run a business website, portfolio, or online shop, speed matters more than most people realise. Slow pages lose visitors, reduce enquiries, and make your business look less trustworthy.",[15,5619,5620],{},"The good news is that the first checks are simple. You do not need to be technical to spot common problems.",[22,5622,25],{"id":24},[15,5624,5625],{},"If your website is slow, the problem is usually one of these:",[30,5627,5628,5631,5634,5637,5640,5646,5649],{},[33,5629,5630],{},"Images are too large",[33,5632,5633],{},"Too many plugins, apps, or scripts are loading",[33,5635,5636],{},"Hosting is underpowered",[33,5638,5639],{},"The mobile version is too heavy",[33,5641,5642,5645],{},[141,5643,5644],{"href":812},"Caching or optimisation"," is missing",[33,5647,5648],{},"Third-party tools are slowing things down",[33,5650,5651],{},"The page is trying to do too much",[15,5653,5654],{},"For most small business websites, it is not one dramatic technical failure. It is usually a pile-up of small decisions.",[52,5656],{},[22,5658,5660],{"id":5659},"what-slow-usually-means","What “Slow” Usually Means",[15,5662,5663],{},"When people say a website is slow, they usually mean one or more of the following:",[135,5665,5666,5669,5672,5675,5678],{},[33,5667,5668],{},"The page takes too long to open",[33,5670,5671],{},"Images load late",[33,5673,5674],{},"The site feels laggy on mobile",[33,5676,5677],{},"Menus and buttons feel delayed",[33,5679,5680],{},"Parts of the page keep shifting while it loads",[15,5682,5683],{},"If that sounds familiar, start with the list below.",[52,5685],{},[22,5687,5689],{"id":5688},"_1-your-images-are-too-large","1. Your Images Are Too Large",[15,5691,5692],{},"This is the most common issue by far.",[15,5694,5695],{},"Many websites use photos that are far bigger than necessary. A business owner uploads a full-size image from a phone or camera, but the website only needs a much smaller version. The result is simple: visitors download heavy files they do not need.",[108,5697,2434],{"id":2433},[135,5699,5700,5703,5706],{},[33,5701,5702],{},"Homepage banners take time to appear",[33,5704,5705],{},"Product photos load slowly",[33,5707,5708],{},"The site feels much worse on mobile data",[108,5710,1963],{"id":1962},[135,5712,5713,5716,5719],{},[33,5714,5715],{},"Are your image files unusually large?",[33,5717,5718],{},"Are there too many images near the top of the page?",[33,5720,5721],{},"Are decorative images being used where plain text would do the job better?",[108,5723,2473],{"id":2472},[15,5725,5726],{},"If your site is carrying around heavy image files, everything else feels slower too.",[52,5728],{},[22,5730,5732],{"id":5731},"_2-too-many-plugins-apps-or-extras","2. Too Many Plugins, Apps, or Extras",[15,5734,5735],{},"Every extra feature adds weight.",[15,5737,5738],{},"Popups, sliders, review widgets, booking tools, chat boxes, cookie banners, analytics scripts, social feeds, and animations all need resources to load. One or two is normal. Too many at once creates drag.",[15,5740,5741,5742,5744],{},"This is especially common on WordPress and website builders where it is easy to add \"just one more thing\". If your site has grown out of control, a proper ",[141,5743,1755],{"href":485}," plan can help keep things lean.",[108,5746,2434],{"id":2491},[135,5748,5749,5752,5755],{},[33,5750,5751],{},"The site used to be faster",[33,5753,5754],{},"Sections load in stages instead of all at once",[33,5756,5757],{},"You have installed lots of tools over time",[108,5759,1963],{"id":4501},[135,5761,5762,5765,5768],{},[33,5763,5764],{},"Do you still need every plugin and widget?",[33,5766,5767],{},"Are two tools doing nearly the same job?",[33,5769,5770],{},"Is something loading on every page when it only needs to appear on one?",[108,5772,2473],{"id":2528},[15,5774,5775],{},"Your site can become slow simply because too many things are trying to speak at once.",[52,5777],{},[22,5779,5781],{"id":5780},"_3-your-hosting-is-too-weak","3. Your Hosting Is Too Weak",[15,5783,5784],{},"Sometimes the website is not the real problem. The server underneath it is.",[15,5786,5787],{},"Cheap hosting often means many websites share the same resources. If the server is overloaded, your site becomes inconsistent and sluggish even if the design itself is reasonable.",[108,5789,2434],{"id":2546},[135,5791,5792,5795,5798],{},[33,5793,5794],{},"Some visits feel normal and others feel painfully slow",[33,5796,5797],{},"The whole site drags, not just one page",[33,5799,5800],{},"Even the admin or login area feels slow",[108,5802,1963],{"id":4556},[135,5804,5805,5808,5811],{},[33,5806,5807],{},"Are you on the cheapest shared hosting plan?",[33,5809,5810],{},"Has your traffic grown since the site was first launched?",[33,5812,5813],{},"Is the slowness affecting the whole site?",[108,5815,2473],{"id":2580},[15,5817,5818,5819,5822],{},"If the engine underneath your site is weak, design tweaks alone will not solve it. A proper ",[141,5820,5821],{"href":812},"performance assessment"," can tell you if hosting is the bottleneck.",[52,5824],{},[22,5826,5828],{"id":5827},"_4-your-mobile-version-is-doing-too-much","4. Your Mobile Version Is Doing Too Much",[15,5830,5831],{},"A site can feel acceptable on desktop and still perform badly on a phone.",[15,5833,5834],{},"Phones have smaller screens, weaker connections, and less patience from users. Large banners, animations, stacked sections, and media-heavy layouts often become much more noticeable on mobile.",[108,5836,2434],{"id":2598},[135,5838,5839,5842,5845],{},[33,5840,5841],{},"People say the site is fine on desktop but bad on phone",[33,5843,5844],{},"Mobile visitors leave quickly",[33,5846,5847],{},"Menus, buttons, or banners feel delayed on smaller screens",[108,5849,1963],{"id":4607},[135,5851,5852,5855,5858],{},[33,5853,5854],{},"Are large visuals still loading on mobile?",[33,5856,5857],{},"Is the top of the page crowded?",[33,5859,5860],{},"Are there too many effects before the main content appears?",[108,5862,2473],{"id":2636},[15,5864,5865],{},"If mobile is slow, the website is slow. That is where most users will judge you.",[52,5867],{},[22,5869,5871],{"id":5870},"_5-there-is-no-proper-caching-or-optimisation","5. There Is No Proper Caching or Optimisation",[15,5873,5874],{},"This sounds technical, but the idea is simple.",[15,5876,5877],{},"Caching helps your site avoid rebuilding everything from scratch every time someone visits. Optimisation helps files load in a cleaner, lighter way. If neither is set up properly, your website does more work than it needs to.",[108,5879,2434],{"id":2654},[135,5881,5882,5885,5888],{},[33,5883,5884],{},"The site is not huge, but still feels heavier than it should",[33,5886,5887],{},"Returning visits feel a bit better than first-time visits",[33,5889,5890],{},"Nobody has ever done any speed-focused setup work",[108,5892,1963],{"id":4658},[135,5894,5895,5898,5901],{},[33,5896,5897],{},"Has caching been configured?",[33,5899,5900],{},"Are images, code, and files being delivered efficiently?",[33,5902,5903],{},"Is there any performance setup at all from your developer or host?",[108,5905,2473],{"id":2700},[15,5907,5908],{},"This is one of the most common hidden issues because everything may “work” while still being inefficient.",[52,5910],{},[22,5912,5914],{"id":5913},"_6-third-party-tools-are-slowing-everything-down","6. Third-Party Tools Are Slowing Everything Down",[15,5916,5917],{},"Many websites depend on outside services.",[15,5919,5920],{},"Maps, embedded videos, live chat, booking systems, analytics tools, review widgets, and social feeds all come from other platforms. Even if your website is built well, one slow external tool can hold up the page.",[108,5922,2434],{"id":3436},[135,5924,5925,5928,5931],{},[33,5926,5927],{},"Pages with embeds feel worse than normal pages",[33,5929,5930],{},"A map, video, or widget takes ages to appear",[33,5932,5933],{},"The slowdown started after adding a marketing tool",[108,5935,1963],{"id":4709},[135,5937,5938,5941,5944],{},[33,5939,5940],{},"Are videos embedded directly on key pages?",[33,5942,5943],{},"Is live chat loading across the whole website?",[33,5945,5946],{},"Do you really need third-party widgets on the homepage?",[108,5948,2473],{"id":3418},[15,5950,5951],{},"The more your site depends on external tools, the less control you have over speed.",[52,5953],{},[22,5955,5957],{"id":5956},"_7-the-page-is-trying-to-do-too-much","7. The Page Is Trying To Do Too Much",[15,5959,5960],{},"Sometimes the issue is not a broken feature. It is the page itself.",[15,5962,5963],{},"A homepage with a giant hero image, multiple sliders, testimonials, reviews, a newsletter popup, social feeds, a background video, and ten different sections will naturally feel heavier than a focused page.",[15,5965,5966],{},"This is a common business mistake: trying to fit everything onto one screen path.",[108,5968,2434],{"id":4057},[135,5970,5971,5974,5977],{},[33,5972,5973],{},"The homepage is slower than the rest of the website",[33,5975,5976],{},"Important information is buried under too much content",[33,5978,5979],{},"Several sections exist without a clear purpose",[108,5981,1963],{"id":4759},[135,5983,5984,5987,5990],{},[33,5985,5986],{},"Does every section earn its place?",[33,5988,5989],{},"Can some content move to inner pages?",[33,5991,5992],{},"Is the top of the page focused on one clear action?",[108,5994,2473],{"id":3473},[15,5996,5997,5998,6001],{},"Fast websites are not just technically lighter. They are more disciplined. If you need help simplifying and rebuilding, my ",[141,5999,6000],{"href":575},"web development service"," can help you start fresh with a focused, fast site.",[52,6003],{},[22,6005,6007],{"id":6006},"a-5-minute-self-check","A 5-Minute Self-Check",[15,6009,6010],{},"Before paying for help, do this quick review:",[135,6012,6013,6016,6019,6022,6025,6028],{},[33,6014,6015],{},"Open your site on your phone using mobile data",[33,6017,6018],{},"Compare the homepage with one inner page",[33,6020,6021],{},"Count how many popups, widgets, and moving elements appear",[33,6023,6024],{},"Look for oversized banners and image-heavy sections",[33,6026,6027],{},"Notice whether videos, maps, or feeds are embedded near the top",[33,6029,6030],{},"Ask yourself whether the website has collected too many extras over time",[15,6032,6033],{},"If three or four of those stand out, you probably already know where the problem starts.",[52,6035],{},[22,6037,4894],{"id":4893},[15,6039,6040],{},"If your site brings in leads, bookings, or sales, speed is worth fixing properly.",[15,6042,6043],{},"A good developer should be able to tell you:",[135,6045,6046,6049,6052,6055],{},[33,6047,6048],{},"what is slowing the website down",[33,6050,6051],{},"which issue matters most",[33,6053,6054],{},"what should be removed, delayed, compressed, or rebuilt",[33,6056,6057],{},"whether hosting is part of the problem",[15,6059,6060,6061,6064],{},"I offer exactly this as part of my ",[141,6062,6063],{"href":812},"performance optimization service"," — a focused audit with clear, actionable recommendations.",[15,6066,6067,6068,6071],{},"You do not always need a redesign. Sometimes a focused ",[141,6069,6070],{"href":812},"performance audit"," is enough.",[52,6073],{},[22,6075,433],{"id":432},[15,6077,6078],{},"Most slow websites are not suffering from a mysterious technical disaster.",[15,6080,6081],{},"They are usually dealing with:",[135,6083,6084,6087,6090,6093,6096],{},[33,6085,6086],{},"oversized images",[33,6088,6089],{},"too many add-ons",[33,6091,6092],{},"weak hosting",[33,6094,6095],{},"heavy mobile layouts",[33,6097,6098],{},"pages that are trying to do too much",[15,6100,6101],{},"Start with the obvious checks first. That alone can save time, money, and a lot of guesswork.",{"title":444,"searchDepth":445,"depth":445,"links":6103},[6104,6105,6106,6111,6116,6121,6126,6131,6136,6141,6142,6143],{"id":24,"depth":445,"text":25},{"id":5659,"depth":445,"text":5660},{"id":5688,"depth":445,"text":5689,"children":6107},[6108,6109,6110],{"id":2433,"depth":452,"text":2434},{"id":1962,"depth":452,"text":1963},{"id":2472,"depth":452,"text":2473},{"id":5731,"depth":445,"text":5732,"children":6112},[6113,6114,6115],{"id":2491,"depth":452,"text":2434},{"id":4501,"depth":452,"text":1963},{"id":2528,"depth":452,"text":2473},{"id":5780,"depth":445,"text":5781,"children":6117},[6118,6119,6120],{"id":2546,"depth":452,"text":2434},{"id":4556,"depth":452,"text":1963},{"id":2580,"depth":452,"text":2473},{"id":5827,"depth":445,"text":5828,"children":6122},[6123,6124,6125],{"id":2598,"depth":452,"text":2434},{"id":4607,"depth":452,"text":1963},{"id":2636,"depth":452,"text":2473},{"id":5870,"depth":445,"text":5871,"children":6127},[6128,6129,6130],{"id":2654,"depth":452,"text":2434},{"id":4658,"depth":452,"text":1963},{"id":2700,"depth":452,"text":2473},{"id":5913,"depth":445,"text":5914,"children":6132},[6133,6134,6135],{"id":3436,"depth":452,"text":2434},{"id":4709,"depth":452,"text":1963},{"id":3418,"depth":452,"text":2473},{"id":5956,"depth":445,"text":5957,"children":6137},[6138,6139,6140],{"id":4057,"depth":452,"text":2434},{"id":4759,"depth":452,"text":1963},{"id":3473,"depth":452,"text":2473},{"id":6006,"depth":445,"text":6007},{"id":4893,"depth":445,"text":4894},{"id":432,"depth":445,"text":433},[477],{"title":6146,"titleAccent":6147,"description":6148,"primaryButtonText":482,"primaryButtonLink":483,"secondaryButtonText":2303,"secondaryButtonLink":812},"Need help fixing a slow website?","Let's talk.","If your site is costing you leads or sales, I can help you identify the bottlenecks, improve speed, and turn performance problems into a clear action plan.",{},{"title":5608,"description":6151,"ogImage":444},"A simple guide for non-technical website owners who want to understand why their site is slow and what to check first.","blog\u002Fwhy-is-my-website-slow-7-simple-things-that-usually-cause-it",[1599,813,499,3664],"YqaXKIFev7qnamCRo0sbUOfPoCgy89NcabyeJCuHFvI",{"id":6156,"title":6157,"author":6158,"body":6159,"categories":6302,"cta":487,"date":6304,"description":6163,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":6305,"navigation":386,"path":6306,"readingTime":445,"seo":6307,"stem":6309,"tags":6310,"__hash__":6311},"blog\u002Fblog\u002Fhow-to-change-the-howdy-text-in-wordpress-admin-bar-based-on-the-time-of-the-day.md","How To Change The Howdy Text In WordPress Admin Bar Based on the time of the day",{"name":8,"avatar":9,"description":10},{"type":12,"value":6160,"toc":6300},[6161,6164,6168,6173,6180,6197,6206,6210,6216,6225,6228,6248,6252,6258,6262,6285,6288,6290],[15,6162,6163],{},"The WordPress admin bar, by default, greets you with a friendly “Howdy” followed by your username. While this greeting is perfectly cordial, you might want to personalize it further by changing it based on the time of day. This can add a nice touch of professionalism and a bit of fun to your WordPress dashboard. In this article, we will guide you through the steps to achieve this.",[6165,6166],"filmstro-widget",{"name":6167},"memorial",[6169,6170,6172],"h4",{"id":6171},"step-1-access-your-themes-functionsphp-file","Step 1: Access Your Theme’s Functions.php File",[15,6174,6175,6176,6179],{},"To start, you’ll need to access your theme’s ",[71,6177,6178],{},"functions.php"," file. This file is where you’ll add the custom code to change the greeting text.",[135,6181,6182,6185,6191],{},[33,6183,6184],{},"Log in to your WordPress dashboard.",[33,6186,6187,6188,917],{},"Navigate to ",[71,6189,6190],{},"Appearance > Theme Editor",[33,6192,6193,6194],{},"On the right-hand side, find and click on ",[71,6195,6196],{},"functions.php.",[15,6198,6199,6202,6203,6205],{},[91,6200,6201],{},"Note:"," Always make a backup of your ",[71,6204,6178],{}," file before making any changes. This will help you restore the original file if something goes wrong.",[6169,6207,6209],{"id":6208},"step-2-add-the-custom-function","Step 2: Add the Custom Function",[15,6211,6212,6213,6215],{},"Next, you’ll add a custom function that determines the appropriate greeting based on the time of day. Here’s the code you need to add to your ",[71,6214,6178],{}," file:",[6217,6218,6223],"pre",{"className":6219,"code":6221,"language":6222},[6220],"language-text","function custom_admin_bar_greeting($wp_admin_bar) {\n    $current_user = wp_get_current_user();\n    $hour = date('H');\n\n    if ($hour >= 5 && $hour = 12 && $hour = 17 && $hour get_node('my-account');\n    $newtitle = str_replace('Howdy,', $greeting . ',', $my_account->title);\n    $wp_admin_bar->add_node([\n        'id' => 'my-account',\n        'title' => $newtitle,\n    ]);\n}\n\nadd_action('admin_bar_menu', 'custom_admin_bar_greeting', 25);\n","text",[71,6224,6221],{"__ignoreMap":444},[15,6226,6227],{},"This code works as follows:",[135,6229,6230,6236,6242],{},[33,6231,6232,6235],{},[91,6233,6234],{},"Get Current User:"," It retrieves the current user’s information.",[33,6237,6238,6241],{},[91,6239,6240],{},"Determine Time of Day:"," It gets the current hour and determines the appropriate greeting.",[33,6243,6244,6247],{},[91,6245,6246],{},"Modify Admin Bar Greeting:"," It replaces the default “Howdy” text with the new greeting based on the time of day.",[6169,6249,6251],{"id":6250},"step-3-save-and-test","Step 3: Save and Test",[15,6253,6254,6255,6257],{},"After adding the code, save your ",[71,6256,6178],{}," file and refresh your WordPress admin dashboard. You should see the greeting in the admin bar change according to the time of day.",[6169,6259,6261],{"id":6260},"additional-tips","Additional Tips",[135,6263,6264,6273,6279],{},[33,6265,6266,6269,6270,6272],{},[91,6267,6268],{},"Error Handling:"," If you encounter any errors, check the syntax and ensure that the code is correctly placed in the ",[71,6271,6178],{}," file.",[33,6274,6275,6278],{},[91,6276,6277],{},"Customization:"," Feel free to customize the greetings or the time ranges to suit your preferences.",[33,6280,6281,6284],{},[91,6282,6283],{},"Backup:"," Always maintain a recent backup of your website before making any changes to the code.",[15,6286,6287],{},"By following these steps, you can create a dynamic and personalized greeting in your WordPress admin bar, enhancing the user experience. Happy coding!",[52,6289],{},[15,6291,6292,6293,6296,6297,917],{},"Need custom WordPress development or ongoing ",[141,6294,6295],{"href":485},"site maintenance","? I build and maintain WordPress sites for businesses and agencies — see my ",[141,6298,6299],{"href":575},"web development services",{"title":444,"searchDepth":445,"depth":445,"links":6301},[],[477,6303],"Snippets","2024-08-07",{},"\u002Fblog\u002Fhow-to-change-the-howdy-text-in-wordpress-admin-bar-based-on-the-time-of-the-day",{"title":6157,"description":6308,"ogImage":444},"Learn how to customize the WordPress admin bar greeting to display time-based messages like Good Morning or Good Evening using a simple PHP snippet.","blog\u002Fhow-to-change-the-howdy-text-in-wordpress-admin-bar-based-on-the-time-of-the-day",[],"NzHliYht5ZDxO_5-0-OknI_ifz7hxk8bzjeB9eCYu_U",{"id":6313,"title":6314,"author":6315,"body":6316,"categories":6405,"cta":487,"date":6406,"description":444,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":6407,"navigation":386,"path":6408,"readingTime":452,"seo":6409,"stem":6412,"tags":6413,"__hash__":6414},"blog\u002Fblog\u002Fgetting-started-with-vue-js-a-beginners-guide.md","Getting Started with Vue.js: A Beginner’s Guide",{"name":8,"avatar":9,"description":10},{"type":12,"value":6317,"toc":6399},[6318,6324,6327,6333,6336,6342,6362,6368,6371,6391,6394],[22,6319,6321],{"id":6320},"introduction-to-vuejs-3",[91,6322,6323],{},"Introduction to Vue.js 3",[15,6325,6326],{},"Vue.js 3 represents a significant evolution in the Vue.js ecosystem, bringing with it a host of improvements and new features aimed at making frontend development more efficient and enjoyable. In this section, we’ll delve into what Vue.js 3 is all about, its key features, and why it’s gaining traction among developers.",[22,6328,6330],{"id":6329},"_1-overview-of-vuejs-3",[91,6331,6332],{},"1. Overview of Vue.js 3",[15,6334,6335],{},"Vue.js is a progressive JavaScript framework used for building user interfaces. It’s known for its simplicity, flexibility, and performance. With the release of Vue.js 3, the framework has undergone major updates and refinements, offering developers a more powerful and streamlined development experience.",[22,6337,6339],{"id":6338},"_2-key-features-of-vuejs-3",[91,6340,6341],{},"2. Key Features of Vue.js 3",[135,6343,6344,6350,6356],{},[33,6345,6346,6349],{},[91,6347,6348],{},"Composition API",": Vue.js 3 introduces the Composition API, which provides a more flexible and scalable way to organize and reuse code logic in components. This API enables developers to encapsulate related functionality into reusable compositions, promoting better code organization and maintainability.",[33,6351,6352,6355],{},[91,6353,6354],{},"Reactivity System Overhaul",": Vue.js 3 introduces a revamped reactivity system that improves performance and reduces memory overhead. With the new Proxy-based reactivity system, Vue.js can track changes more efficiently, resulting in faster rendering and better overall performance.",[33,6357,6358,6361],{},[91,6359,6360],{},"Teleport",": Vue.js 3 introduces the Teleport feature, which allows developers to efficiently render content at a different place in the DOM tree. This feature is particularly useful for building complex UI components like modals, tooltips, and popovers while maintaining clean and maintainable code.",[22,6363,6365],{"id":6364},"_3-why-vuejs-3",[91,6366,6367],{},"3. Why Vue.js 3?",[15,6369,6370],{},"Vue.js 3 brings several compelling reasons for developers to adopt it in their projects:",[135,6372,6373,6379,6385],{},[33,6374,6375,6378],{},[91,6376,6377],{},"Performance",": With its optimized reactivity system and enhanced rendering mechanism, Vue.js 3 offers improved performance compared to its predecessors, making it a suitable choice for building high-performance web applications.",[33,6380,6381,6384],{},[91,6382,6383],{},"Developer Experience",": The Composition API simplifies code organization and promotes better reusability, leading to a more pleasant development experience. Additionally, Vue.js’s clear and concise syntax makes it easy for developers to learn and work with.",[33,6386,6387,6390],{},[91,6388,6389],{},"Community Support",": Vue.js boasts a vibrant and supportive community of developers and contributors who actively contribute to its ecosystem. With the release of Vue.js 3, the community continues to grow, offering valuable resources, plugins, and tools to aid in development.",[15,6392,6393],{},"In summary, Vue.js 3 represents a significant advancement in frontend development, offering developers a powerful yet intuitive framework for building modern web applications. Its focus on performance, developer experience, and community support makes it a compelling choice for projects of all sizes.",[15,6395,6396,6397,917],{},"If you're looking for a Vue.js or Nuxt developer to bring your project to life, check out my ",[141,6398,6299],{"href":575},{"title":444,"searchDepth":445,"depth":445,"links":6400},[6401,6402,6403,6404],{"id":6320,"depth":445,"text":6323},{"id":6329,"depth":445,"text":6332},{"id":6338,"depth":445,"text":6341},{"id":6364,"depth":445,"text":6367},[477],"2024-03-21",{},"\u002Fblog\u002Fgetting-started-with-vue-js-a-beginners-guide",{"title":6410,"description":6411,"ogImage":444},"Getting Started with Vue.js: A Beginner's Guide","A beginner-friendly introduction to Vue.js 3 covering key features, the Composition API, reactivity system, and why developers are choosing Vue.","blog\u002Fgetting-started-with-vue-js-a-beginners-guide",[],"skaHj7aXPxIx3oSKm2tcMBUxc7I1gNMCq8Y5woPVxt0",{"id":6416,"title":6417,"author":6418,"body":6419,"categories":6478,"cta":487,"date":6480,"description":444,"excerpt":487,"extension":488,"image":6481,"imageAlt":6482,"meta":6483,"navigation":386,"path":6484,"readingTime":6485,"seo":6486,"stem":6488,"tags":6489,"__hash__":6490},"blog\u002Fblog\u002Fcreate-wordpress-admin-account-via-sql.md","Create WordPress admin account via SQL command",{"name":8,"avatar":9,"description":10},{"type":12,"value":6420,"toc":6474},[6421,6430,6433,6436,6439,6443,6449,6453,6459,6465],[6422,6423,6424],"blockquote",{},[15,6425,6426,6427,917],{},"Locked out of your WordPress site? This guide shows you how to regain access via SQL. If you need ongoing help keeping your WordPress site running smoothly, see my ",[141,6428,6429],{"href":485},"website maintenance services",[15,6431,6432],{},"There might be a time where you might bee locked out of your admin account because you either forgot the password and and reseting the is not an option because you no longer have access to that email. Or the website has been hacked and you have to create an admin account.",[15,6434,6435],{},"The only option is to create a user via the MySQL. But remembering the long sql query is difficult.",[15,6437,6438],{},"An exaple query would be like the following example:",[22,6440,6442],{"id":6441},"create-user-account","Create User account",[6217,6444,6447],{"className":6445,"code":6446,"language":6222},[6220],"INSERT INTO `wp_users` (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`,`user_registered`)\nVALUES ('admin', MD5('changeme'), 'Mr Admin', 'admin@example.com', '0','2019-12-27');\n",[71,6448,6446],{"__ignoreMap":444},[22,6450,6452],{"id":6451},"add-user-permissions","Add user permissions",[6217,6454,6457],{"className":6455,"code":6456,"language":6222},[6220],"INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) \nVALUES (NULL, (Select max(id) FROM wp_users), 'wp_capabilities', 'a:1:{s:13:\"administrator\";s:1:\"1\";}');\n",[71,6458,6456],{"__ignoreMap":444},[6217,6460,6463],{"className":6461,"code":6462,"language":6222},[6220],"INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) \nVALUES (NULL, (Select max(id) FROM wp_users), 'wp_user_level', '10');\n",[71,6464,6462],{"__ignoreMap":444},[15,6466,6467,6468,6473],{},"That is the reason I created ",[141,6469,6472],{"href":6470,"rel":6471},"https:\u002F\u002Fkociaj.com\u002Ftools\u002Fwpadmin",[3136],"WPAdmin"," (I know it is an original name) a tool to help that will generate the SQL query for you.",{"title":444,"searchDepth":445,"depth":445,"links":6475},[6476,6477],{"id":6441,"depth":445,"text":6442},{"id":6451,"depth":445,"text":6452},[477,6479,6303],"Project","2019-12-27","\u002Fimages\u002Fblog\u002FScreenshot-2024-07-20-at-23.38.47.png","WordPress admin account creation via SQL command",{},"\u002Fblog\u002Fcreate-wordpress-admin-account-via-sql",1,{"title":6417,"description":6487,"ogImage":6481},"Quickly create a WordPress admin account via SQL or WP CLI. Ideal for developers needing instant site access without hassle.","blog\u002Fcreate-wordpress-admin-account-via-sql",[],"6LMXcIs67v03IS_QOU8VXEZv3YKlX0QtQneAyA4xpdE",{"id":6492,"title":6493,"author":6494,"body":6495,"categories":6838,"cta":487,"date":6840,"description":6841,"excerpt":487,"extension":488,"image":6842,"imageAlt":6843,"meta":6844,"navigation":386,"path":6845,"readingTime":6846,"seo":6847,"stem":6849,"tags":6850,"__hash__":6853},"blog\u002Fblog\u002Fgridsome-source-plugin-for-dev-to-api.md","Gridsome Source Plugin for dev.to API",{"name":8,"avatar":9,"description":10},{"type":12,"value":6496,"toc":6829},[6497,6505,6509,6512,6515,6528,6532,6535,6579,6587,6591,6595,6601,6607,6613,6619,6622,6626,6649,6653,6664,6670,6685,6692,6696,6718,6721,6725,6732,6738,6741,6746,6761,6764,6767,6770,6776,6793,6796,6799,6806,6816,6818],[15,6498,6499,6500],{},"Just created a plugin for Gridsome, a source plugin to retrieve posts from using dev.to API.\nYou are able to find the plugin on the NPM registry ",[141,6501,6504],{"href":6502,"rel":6503},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@perlatsp\u002Fgridsome-source-devto",[3136],"here",[22,6506,6508],{"id":6507},"what-is-gridsome","What is Gridsome",[15,6510,6511],{},"Ok, hold on a second! What is Gridsome?",[15,6513,6514],{},"Glad you asked!",[15,6516,6517,6518,6523,6524,6527],{},"Gridsome is a static site generator similar to Gatsby (though still new so not as feature-rich) for the ",[141,6519,6522],{"href":6520,"rel":6521},"https:\u002F\u002Fvuejs.org\u002F",[3136],"Vue"," framework. Gridsome makes it easy for developers to build modern ",[141,6525,6526],{"href":575},"JAMstack websites"," & PWAs that are fast by default.",[22,6529,6531],{"id":6530},"why-gridsome","Why Gridsome?",[15,6533,6534],{},"If you are going to use gridsome you have following by default:",[135,6536,6537,6543,6549,6555,6561,6567,6573],{},[33,6538,6539,6542],{},[91,6540,6541],{},"Local development with hot-reloading"," – See code changes in real-time.",[33,6544,6545,6548],{},[91,6546,6547],{},"Data source plugins"," – Connect to any popular Headless CMSs, APIs or Markdown-files.",[33,6550,6551,6554],{},[91,6552,6553],{},"File-based page routing"," – Quickly create and manage routes with files.",[33,6556,6557,6560],{},[91,6558,6559],{},"Centralized data management"," – Pull data into a local, unified GraphQL data layer.",[33,6562,6563,6566],{},[91,6564,6565],{},"Vue.js for frontend"," – A lightweight and approachable front-end framework.",[33,6568,6569,6572],{},[91,6570,6571],{},"Auto-optimized code"," – Get code-splitting and asset optimization out-of-the-box.",[33,6574,6575,6578],{},[91,6576,6577],{},"Static files generation"," – Deploy securely to any CDN or static web host.",[15,6580,6581,6582],{},"For more in-depth information about Gridsome please read the ",[141,6583,6586],{"href":6584,"rel":6585},"https:\u002F\u002Fgridsome.org\u002Fdocs",[3136],"docs",[22,6588,6590],{"id":6589},"how-to-use-this-plugin","How to use this plugin?",[108,6592,6594],{"id":6593},"installation","Installation",[15,6596,6597,6598,917],{},"To install this plugin you just need to add it as a dependency on your gridsome project. You can do it by running the following command on your terminal using ",[71,6599,6600],{},"yarn",[6217,6602,6605],{"className":6603,"code":6604,"language":6222},[6220],"yarn add @perlatsp\u002Fgridsome-source-devto\n",[71,6606,6604],{"__ignoreMap":444},[15,6608,6609,6610],{},"or if you prefer ",[71,6611,6612],{},"npm",[6217,6614,6617],{"className":6615,"code":6616,"language":6222},[6220],"npm install @perlatsp\u002Fgridsome-source-devto\n",[71,6618,6616],{"__ignoreMap":444},[15,6620,6621],{},"When the installation finishes you should be ready for the next step, which is configuring the plugin.",[108,6623,6625],{"id":6624},"configuration","Configuration",[15,6627,6628,6629,6634,6635,6640,6641,6644,6645,6648],{},"Before we continue configuring the plugin, what we need to do first is getting an API key from ",[141,6630,6633],{"href":6631,"rel":6632},"https:\u002F\u002Fdev.to\u002F",[3136],"https:\u002F\u002Fdev.to",". To do so, we need to go to dev.to website, go to ",[141,6636,6639],{"href":6637,"rel":6638},"https:\u002F\u002Fdev.to\u002Fsettings\u002Faccount",[3136],"account->settings"," and then you should see an input box, add a description for the token and smash that ",[71,6642,6643],{},"Generate Token"," button. After doing so, this might take a while for the token to be generated for you (circa ",[71,6646,6647],{},"200ms"," depending on your internet connection 🤪).",[6169,6650,6652],{"id":6651},"configurration-file","Configurration file",[15,6654,6655,6656,6659,6660,6663],{},"When you get your token we can proceed to the next step. Adding the configuration to the ",[71,6657,6658],{},"gridsome.config.js"," file. This file is where most of the gridsome configurations live. Open the configuration file and add the following to the ",[71,6661,6662],{},"plugins"," array. Like the following",[6217,6665,6668],{"className":6666,"code":6667,"language":6222},[6220],"...other gridsome plugins\n   {\n      use: '@perlatsp\u002Fgridsome-source-devto',\n      options: {\n        typeName: 'Article',\n        username:'DEVTO_USERNAME',\n        apiKey: process.env.DEVTO_API_KEY,\n        route: '\u002F:slug',\n      }\n    }\n... rest of config file\n",[71,6669,6667],{"__ignoreMap":444},[15,6671,6672,6673,6676,6677,6680,6681,6684],{},"What we did here is to tell gridsome to use our plugin ",[71,6674,6675],{},"use: '@perlatsp\u002Fgridsome-source-devto'"," with an ",[71,6678,6679],{},"options"," object. The options object is pretty straight forward, we are assigning a ",[71,6682,6683],{},"typeName: 'Article'",", this is the name of our ‘post model’ we will use this later to query the posts.",[15,6686,6687,6688,6691],{},"We have ",[71,6689,6690],{},"username:'DEVTO_USERNAME'"," which is the author’s username we want to retrieve from the API.",[6169,6693,6695],{"id":6694},"env-file","ENV File",[15,6697,6698,6699,6702,6703,6706,6707,6709,6710,6713,6714,917],{},"API key variable, ",[71,6700,6701],{},"apiKey: process.env.DEVTO_API_KEY"," which is getting the value from the ",[71,6704,6705],{},".env"," file for security reasons so don’t have this in our codebase. We need to create a ",[71,6708,6705],{}," file in our project root directory and add the following ",[71,6711,6712],{},"DEVTO_API_KEY=THE_API_KEY_FROM_DEVTO_SITE",". And the last configuration we need to do is the route. this will be the single post’s URL display type. More about gridsome routing ",[141,6715,6504],{"href":6716,"rel":6717},"https:\u002F\u002Fgridsome.org\u002Fdocs\u002Frouting\u002F#routing",[3136],[15,6719,6720],{},"Now we are ready to roll to the next step displaying the posts.",[108,6722,6724],{"id":6723},"display-posts","Display Posts",[15,6726,6727,6728,6731],{},"To display the posts we need to head over to the ",[71,6729,6730],{},"Index.vue"," file and modify the component (if the component does not exist, create one) to reflect the following:",[6217,6733,6736],{"className":6734,"code":6735,"language":6222},[6220],"query Home {\n    allArticle {\n      edges {\n        node {\n          id\n          title\n          published_at\n          path\n          description\n          tag_list\n          canonical_url\n          cover_image\n        }\n      }\n    }\n  }\n",[71,6737,6735],{"__ignoreMap":444},[15,6739,6740],{},"This is a GraphQL query.",[6422,6742,6743],{},[15,6744,6745],{},"GraphQL is a declarative query language especially useful for retrieving only the data you ask for. Which again will result in smaller bundles.",[15,6747,6748,6749,6752,6753,6756,6757,6760],{},"We are registering entities named ",[71,6750,6751],{},"allArticle"," (",[91,6754,6755],{},"all"," + the ",[91,6758,6759],{},"typeName"," we registered in our config file).",[15,6762,6763],{},"There is no need to get all the data from our articles, so we are requesting some of the nodes (fields) like id, title, description, etc.",[15,6765,6766],{},"Ok, we have our loop query. now what? Is that it?",[15,6768,6769],{},"Of course not! Now we need somehow to display the date we have. to do so, scroll up to the ` component. and modify it to reflect the following :",[6217,6771,6774],{"className":6772,"code":6773,"language":6222},[6220],"Gridsome source plugin for\n            \n        \n        \n             {{node.title}}\n            {{node.description}}\n            \n                Read More\n",[71,6775,6773],{"__ignoreMap":444},[15,6777,6778,6779,6783,6784,6787,6788,917],{},"And ",[6780,6781,6782],"em",{},"voila"," we can now see our posts! Open your terminal and run ",[71,6785,6786],{},"yarn develop","to compile and create a dev server. your project should be available on ",[141,6789,6792],{"href":6790,"rel":6791},"http:\u002F\u002Flocalhost:8080\u002F",[3136],"http:\u002F\u002Flocalhost:8080",[15,6794,6795],{},"If you followed the previous steps you should have something similar to the following picture. Navigation on top, a heading and the loop with the posts displaying the title, description and the link to the post.",[15,6797,6798],{},"Personally, I don’t like how it is visually. Let us add some styles.",[15,6800,6801,6802,6805],{},"A bit better 😄 with simple cards. We have now finished the project and we can run ",[71,6803,6804],{},"yarn build"," to generate all the static files and ready to deploy! ⛴",[6422,6807,6808],{},[15,6809,6810,6811],{},"This plugin is still in development and more work needs to be done. Such us displaying more data for the single article page. PRs more than welcome on ",[141,6812,6815],{"href":6813,"rel":6814},"https:\u002F\u002Fgithub.com\u002Fperlatsp\u002Fgridsome-source-devto",[3136],"github",[52,6817],{},[15,6819,6820,6821,6823,6824,6828],{},"Looking for a Vue.js developer to build your next project? Check out my ",[141,6822,6299],{"href":575}," or get in touch for ",[141,6825,6827],{"href":6826},"\u002Fservices\u002Fwhite-label-development","white-label development"," if you're an agency.",{"title":444,"searchDepth":445,"depth":445,"links":6830},[6831,6832,6833],{"id":6507,"depth":445,"text":6508},{"id":6530,"depth":445,"text":6531},{"id":6589,"depth":445,"text":6590,"children":6834},[6835,6836,6837],{"id":6593,"depth":452,"text":6594},{"id":6624,"depth":452,"text":6625},{"id":6723,"depth":452,"text":6724},[477,6839],"Uncategorized","2019-07-02","Just created a plugin for Gridsome, a source plugin to retrieve posts from using dev.to API.\nYou are able to find the plugin on the NPM registry here","\u002Fimages\u002Fblog\u002Fdevtoapi.png","Gridsome source plugin for dev.to API",{},"\u002Fblog\u002Fgridsome-source-plugin-for-dev-to-api",4,{"title":6493,"description":6848,"ogImage":6842},"A plugin for Gridsome to pull your posts from dev.to website, from your profile or a choosen profile.","blog\u002Fgridsome-source-plugin-for-dev-to-api",[6851,6852],"gridsome","VueJS","xF1TjiN_GNDT2fvCxeVuCsyDS0yWjGkcI435jkmYyAg",{"id":6855,"title":6856,"author":6857,"body":6858,"categories":7647,"cta":487,"date":7648,"description":6862,"excerpt":487,"extension":488,"image":7649,"imageAlt":7650,"meta":7651,"navigation":386,"path":7652,"readingTime":7653,"seo":7654,"stem":7656,"tags":7657,"__hash__":7661},"blog\u002Fblog\u002Fhow-to-create-and-publish-npm-packages.md","How to create and publish NPM Packages",{"name":8,"avatar":9,"description":10},{"type":12,"value":6859,"toc":7624},[6860,6863,6867,6887,6890,6911,6956,6960,6963,6974,6977,6980,7010,7014,7018,7021,7025,7033,7040,7043,7047,7055,7058,7061,7067,7070,7077,7080,7086,7091,7094,7104,7108,7125,7129,7136,7141,7144,7151,7163,7168,7172,7179,7186,7192,7199,7202,7207,7211,7214,7220,7230,7233,7239,7246,7249,7268,7271,7274,7280,7294,7298,7305,7308,7327,7333,7343,7358,7365,7375,7385,7388,7392,7395,7398,7405,7412,7417,7421,7424,7430,7434,7442,7450,7456,7462,7470,7476,7479,7482,7488,7491,7494,7497,7503,7506,7513,7517,7521,7524,7531,7538,7545,7549,7565,7568,7571,7575,7578,7605,7608,7611,7614,7617,7619],[15,6861,6862],{},"The aim of this article is to learn what is npm what do we need to run\u002Finstall npm packages and we will learn how we can create and publish a package to the npm registry and feel like a cool and badass developer 😎.",[22,6864,6866],{"id":6865},"table-of-contents","Table of Contents",[135,6868,6869,6875,6881],{},[33,6870,6871],{},[141,6872,6874],{"href":6873},"#what-is","What is NPM",[33,6876,6877],{},[141,6878,6880],{"href":6879},"#requirements","Requirements",[33,6882,6883],{},[141,6884,6886],{"href":6885},"#our-package","Our NPM Package",[22,6888,6874],{"id":6889},"what-is-npm",[15,6891,6892,6893,6896,6897,6900,6901,6904,6905,6910],{},"What is npm again ? Well, NPM stands for ",[91,6894,6895],{},"N","ode ",[91,6898,6899],{},"P","ackage ",[91,6902,6903],{},"M","anager and as the authors define it on their ",[141,6906,6909],{"href":6907,"rel":6908},"https:\u002F\u002Fwww.npmjs.com\u002Fabout",[3136],"website"," :",[135,6912,6913,6928,6953],{},[33,6914,6915,6916,6921,6922,6927],{},"npm is the package manager for ",[141,6917,6920],{"href":6918,"rel":6919},"http:\u002F\u002Fnodejs.org\u002F",[3136],"Node.js",". It was created in 2009 as an ",[141,6923,6926],{"href":6924,"rel":6925},"https:\u002F\u002Fgithub.com\u002Fnpm\u002Fnpm",[3136],"open source project ","to help JavaScript developers easily share packaged modules of code.",[33,6929,6930,6931,6936,6937,6936,6942,6936,6947,6952],{},"The npm Registry is a public collection of packages of open-source code for Node.js, ",[141,6932,6935],{"href":6933,"rel":6934},"http:\u002F\u002Fwww.ember-cli.com\u002F",[3136],"front-end web apps",", ",[141,6938,6941],{"href":6939,"rel":6940},"http:\u002F\u002Fcordova.apache.org\u002F",[3136],"mobile apps",[141,6943,6946],{"href":6944,"rel":6945},"https:\u002F\u002Ftessel.io\u002F",[3136],"robots",[141,6948,6951],{"href":6949,"rel":6950},"https:\u002F\u002Flinerate.f5.com\u002F",[3136],"routers",", and countless other needs of the JavaScript community.",[33,6954,6955],{},"npm is the command line client that allows developers to install and publish those packages.",[22,6957,6959],{"id":6958},"our-package","Our Package",[15,6961,6962],{},"For the scope of this article, we will get step by step of the process of creating an npm package and publish it on the npm registry so other developers around the world can use our package.",[15,6964,6965,6966,6969,6970,6973],{},"The package we are going to create is a simple CLI app that will accept an email as an argument and will check if that email has been found in public data breaches. To achieve this we will be making ",[91,6967,6968],{},"HTTP"," requests to an external API, the haveibeenpawned.com website’s API. The name of our package? ",[91,6971,6972],{},"pawnhub"," 🙄 😉",[22,6975,6880],{"id":6976},"requirements",[15,6978,6979],{},"To build our package we need the following",[135,6981,6982,6985,6999,7007],{},[33,6983,6984],{},"A working Computer 💻 🤓 i will be using MacOS but the process is similar to all OS.",[33,6986,6987,6988,6993,6994,3786],{},"A Code Editor 📜 (I use ",[141,6989,6992],{"href":6990,"rel":6991},"https:\u002F\u002Fcode.visualstudio.com\u002F",[3136],"Visual Studio Code ","or ",[141,6995,6998],{"href":6996,"rel":6997},"https:\u002F\u002Fwww.jetbrains.com\u002Fwebstorm\u002F",[3136],"WebStorm",[33,7000,7001,7006],{},[141,7002,7005],{"href":7003,"rel":7004},"https:\u002F\u002Fnodejs.org\u002F",[3136],"NodeJS"," installed our system with NPM installed and",[33,7008,7009],{},"Internet Connection",[22,7011,7013],{"id":7012},"getting-started","Getting Started",[108,7015,7017],{"id":7016},"install-nodejs","Install NodeJS",[15,7019,7020],{},"To install NodeJS on our system we can do it in many ways, i will demonstrate 2 of them.",[6169,7022,7024],{"id":7023},"install-from-official-website","Install from official website",[15,7026,7027,7028,7032],{},"Visit the official NodeJs website ",[141,7029,7031],{"href":7003,"rel":7030},[3136],"https:\u002F\u002Fnodejs.org",", press the download button",[15,7034,7035],{},[7036,7037],"img",{"alt":7038,"src":7039},"nodejs","\u002Fimages\u002Fblog\u002Fnodejsinstall.png",[15,7041,7042],{},"When the download is finished, open the file and follow the instructions to complete the installation. Doing so will install node and npm.",[6169,7044,7046],{"id":7045},"install-using-homebrew","Install using homebrew",[15,7048,7049,7054],{},[141,7050,7053],{"href":7051,"rel":7052},"https:\u002F\u002Fbrew.sh\u002F",[3136],"Homebrew"," is a package manager for MacOS or Linux.",[15,7056,7057],{},"First, we need to install Homebrew (if not already installed).",[15,7059,7060],{},"Open the terminal and run the following command:",[6217,7062,7065],{"className":7063,"code":7064,"language":6222},[6220],"\u002Fusr\u002Fbin\u002Fruby -e \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002Fmaster\u002Finstall)\"\n",[71,7066,7064],{"__ignoreMap":444},[15,7068,7069],{},"This will download and install Homebrew for us.",[15,7071,7072,7073,7076],{},"Then run ",[71,7074,7075],{},"brew update"," to make sure Homebrew is up to date.",[15,7078,7079],{},"To install Node we just simply run the below command:",[6217,7081,7084],{"className":7082,"code":7083,"language":6222},[6220],"brew install node\n",[71,7085,7083],{"__ignoreMap":444},[15,7087,7088],{},[7036,7089],{"alt":7038,"src":7090},"\u002Fimages\u002Fblog\u002Fnodeinstalled.png",[15,7092,7093],{},"To confirm we have installed Node and NPM on our system, we can run the following commands:",[15,7095,7096,7099,7100,7103],{},[71,7097,7098],{},"node -v"," and ",[71,7101,7102],{},"npm -v"," it will display the version we have just installed .",[22,7105,7107],{"id":7106},"creating-the-package","Creating the Package",[15,7109,7110,7111,7114,7115,7118,7119,7121,7122,917],{},"First, we need to create a directory for our project. I like to have all my projects in the ",[71,7112,7113],{},"~\u002Fprojects"," directory 🗂. Open the terminal and run ",[71,7116,7117],{},"mkdir pawnhub"," this will create a folder named ",[6780,7120,6972],{},", then enter the directory ",[71,7123,7124],{},"cd pawnhub",[108,7126,7128],{"id":7127},"npm-init","NPM Init",[15,7130,7131,7132,7135],{},"Now that we are inside our project directory, we need to initialize an npm project. We can do that by running ",[71,7133,7134],{},"npm init",". This will start the interactive clip and ask us some information about our new package, such as the name, version, description, author, and license.",[15,7137,7138],{},[7036,7139],{"alt":7038,"src":7140},"\u002Fimages\u002Fblog\u002Fnpminit.png",[15,7142,7143],{},"When we fill all the info we will be asked to confirm the information we have just entered.",[15,7145,7146,7147,7150],{},"Next, we need to open the project in our code editor. With Visual Studio Code we can run the command ",[71,7148,7149],{},"code ."," which will open the current directory or we can open the Visual Studio Code and press COMMAND+O and open the dir.",[15,7152,7153,7154,7157,7158],{},"You will find that we have only 1 file the ",[71,7155,7156],{},"package.json",". More about the package.json file ",[141,7159,7162],{"href":7160,"rel":7161},"https:\u002F\u002Fdocs.npmjs.com\u002Ffiles\u002Fpackage.json",[3136],"here!",[15,7164,7165],{},[7036,7166],{"alt":7038,"src":7167},"\u002Fimages\u002Fblog\u002Fnpmconfirm.png",[108,7169,7171],{"id":7170},"main-file","Main File",[15,7173,7174,7175,7178],{},"Our next step is to create the main file we are going to use, the ",[71,7176,7177],{},"index.js"," file.",[15,7180,7181,7182,7185],{},"create the file in our root dir ",[71,7183,7184],{},"touch index.js",". Open the file and copy-paste the following :",[6217,7187,7190],{"className":7188,"code":7189,"language":6222},[6220],"let message = 'Hello World!';console.log(message)\n",[71,7191,7189],{"__ignoreMap":444},[15,7193,7194,7195,7198],{},"Running the file is pretty straightforward. Open the terminal and run ",[71,7196,7197],{},"node index.js"," this will tell Node to run the index.js file. We should see the following on our terminal.",[15,7200,7201],{},"Cool huh? But, it is not dynamic. we cannot change the outputted message! We will learn how to do so in the next section using arguments.",[15,7203,7204],{},[7036,7205],{"alt":7038,"src":7206},"\u002Fimages\u002Fblog\u002Fopendir.png",[108,7208,7210],{"id":7209},"node-arguments","Node Arguments",[15,7212,7213],{},"Normally, when we want to pass arguments we do the following:",[15,7215,7216,7219],{},[71,7217,7218],{},"node filename argument1 argument2 argumentN...."," But the question is, how can you access these arguments ?",[15,7221,7222,7223,7226,7227,7229],{},"The simplest way of retrieving arguments in Node.js is via the ",[71,7224,7225],{},"process.argv"," array. This is a global object that we can use without importing any additional libraries to use it. These arguments can be accessed within the application via the ",[71,7228,7225],{}," array. Let us start using arguments!",[15,7231,7232],{},"Modify the file to the following:",[6217,7234,7237],{"className":7235,"code":7236,"language":6222},[6220],"let message = 'Hello World!';console.log(process.argv)\n",[71,7238,7236],{"__ignoreMap":444},[15,7240,7241,7242,7245],{},"and run ",[71,7243,7244],{},"node index.js argument"," we will have something like the following image.",[15,7247,7248],{},"You will have noticed that we have an array with 3 string items. I marked them with 0,1 and 2.",[15,7250,7251,7252,7255,7256,7259,7260,7263,7264,7267],{},"The argument with key",[71,7253,7254],{},"0"," is the ",[71,7257,7258],{},"node"," itself, argument ",[71,7261,7262],{},"1"," is the file being executed and the last (",[71,7265,7266],{},"2",") argument is the argument that we will be using in this tutorial.",[15,7269,7270],{},"Ok, so now we need to do something with the last argument. Let’s display a customized message on the console.",[15,7272,7273],{},"change the code to the following:",[6217,7275,7278],{"className":7276,"code":7277,"language":6222},[6220],"let name = process.argv[2];let message = `Hello ${name}`;console.log(process.argv)\n",[71,7279,7277],{"__ignoreMap":444},[15,7281,7282,7283,7286,7287,6752,7290,7293],{},"What we did here is we initialize a variable called ",[71,7284,7285],{},"name"," have a value from the third (key 2 as we start counting from 0 ) argument of the current process. Let’s run ",[71,7288,7289],{},"node index.js Perlat",[91,7291,7292],{},"Perlat"," is my name, so you can change this accordingly)",[108,7295,7297],{"id":7296},"make-it-executable","Make it Executable",[15,7299,7300,7301,7304],{},"So far so good, we have created our simple app, and we can run it by running ",[71,7302,7303],{},"node index.js name"," but we need to be inside the directory for this to work. and we need to run every time the node and then the file, and then add an argument.",[15,7306,7307],{},"How can we create an executable that will allow us to run the command from whatever directory?",[15,7309,7310,7311,7313,7314,7317,7318,7322,7323,7326],{},"The answer is node binaries! And we can easily do this by adding a new field in the ",[71,7312,7156],{}," file, the ",[71,7315,7316],{},"bin"," field. More info about the bin field ",[141,7319,6504],{"href":7320,"rel":7321},"https:\u002F\u002Fdocs.npmjs.com\u002Ffiles\u002Fpackage.json#bin",[3136],". Now, add this inside your package.json, I usually add this just after the ",[71,7324,7325],{},"main"," field.",[6217,7328,7331],{"className":7329,"code":7330,"language":6222},[6220],"\"bin\":{  \"pawnhub\":\".\u002Findex.js\"},\n",[71,7332,7330],{"__ignoreMap":444},[15,7334,7335,7336,7338,7339,7342],{},"By doing so, we say to node that we want to register a command named ",[71,7337,6972],{}," that will execute the ",[71,7340,7341],{},".\u002Findex.js"," file upon running it. We can add multiple executables inside the bin file by specifying the name and the file to execute.",[15,7344,7345,7346,7349,7350,7353,7354,7357],{},"If you are impatient and already ran the command ",[71,7347,7348],{},"pawnhub name"," you will get an error ",[71,7351,7352],{},"command not found: pawnhub"," this is because the command is not linked. We can do this by running ",[71,7355,7356],{},"npm link"," inside our directory, and voila! our package is available symlinked globally on our system! Go ahead an try it. It will fail!",[15,7359,7360,7361,7364],{},"Reason is because we need to add ",[71,7362,7363],{},"#!\u002Fusr\u002Fbin\u002Fenv node"," at the very top of the index.js file.",[15,7366,7367,7368,7371,7372,7374],{},"By adding it , we are telling *nix systems that the interpreter of our JavaScript file should be ",[71,7369,7370],{},"\u002Fusr\u002Fbin\u002Fenv node"," which looks up for the locally-installed ",[71,7373,7258],{},"executable.",[15,7376,7377,7378,7381,7382,7384],{},"In Windows, that line will just be ignored because it will be interpreted as a comment, but ",[91,7379,7380],{},"it has to be there"," because ",[71,7383,6612],{}," will read it on a Windows machine when the NodeJS command-line package is being installed. Now try again and it should be working fine!",[15,7386,7387],{},"Now we have a package that is acceptin arguments and can be accessed globally. We need to start working on our final package, making the http requests to haveibeenpawned.com website.",[108,7389,7391],{"id":7390},"install-axios","Install Axios",[15,7393,7394],{},"What is Axios?",[15,7396,7397],{},"Axios is a promise based HTTP client for the browser and node.js. We can make requests such as GET, POST, DELETE or PUT. we are going to use only the GET request.",[15,7399,7400,7401,917],{},"More information about axios ",[141,7402,6504],{"href":7403,"rel":7404},"https:\u002F\u002Fgithub.com\u002Faxios\u002Faxios",[3136],[15,7406,7407,7408,7411],{},"Because Axios is an npm package we can install it by running ",[71,7409,7410],{},"npm install axios"," and it will be installed on our project. Axios can be used in browser applications as well by using a CDN or the path to the file like:",[6217,7413,7415],{"className":7414,"code":444,"language":6222},[6220],[71,7416,444],{"__ignoreMap":444},[108,7418,7420],{"id":7419},"using-axios","Using Axios",[15,7422,7423],{},"This is a simple GET request using axios! (modified from the example on the official docs)",[6217,7425,7428],{"className":7426,"code":7427,"language":6222},[6220],"const axios = require('axios');​\u002F\u002F Make a request for a user with a given IDaxios.get('ENDPOINT')  .then(function (response) {    \u002F\u002F handle the response when it is a success    console.log(response);  })  .catch(function (error) {    \u002F\u002F handle when error ocurrs (eg: 404)    console.log(error);  })\n",[71,7429,7427],{"__ignoreMap":444},[22,7431,7433],{"id":7432},"using-haveibeenpawnedcom-api","Using Haveibeenpawned.com API",[15,7435,7436,7437,7441],{},"Go ahead and try the ",[141,7438,7439],{"href":7439,"rel":7440},"https:\u002F\u002Fhaveibeenpwned.com",[3136]," website (HIBP for abbreviation) and check if you have an account that has been compromised in a data breach. We will be using their API to achieve the functionality we desire.",[15,7443,7444,7445,7449],{},"The ",[141,7446,6586],{"href":7447,"rel":7448},"https:\u002F\u002Fhaveibeenpwned.com\u002FAPI\u002Fv2",[3136]," for using the API, for a reference.",[15,7451,7452,7453,7455],{},"Ok, now let’s make a request to HIBP API. Modify the ",[71,7454,7177],{}," to reflect the bellow code",[6217,7457,7460],{"className":7458,"code":7459,"language":6222},[6220],"#!\u002Fusr\u002Fbin\u002Fenv node\n\nconst axios = require('axios');\n\naxios.get(`https:\u002F\u002Fhaveibeenpwned.com\u002Fapi\u002Fv2\u002Fbreachedaccount\u002Fadmin@test.com`)\n.then(response=>{\n     console.log(response.data)\n})\n.catch(err=>{\n    console.log(err)\n})\n",[71,7461,7459],{"__ignoreMap":444},[15,7463,7464,7465,7469],{},"We are calling the API to search the breachedaccount for ",[141,7466,7468],{"href":7467},"mailto:admin@test.com","admin@test.com"," email.",[15,7471,7472,7473,7475],{},"Now run ",[71,7474,6972],{}," and you should get a big JSON object like the following sample.",[15,7477,7478],{},"But we don’t need every information from that JSON object…",[15,7480,7481],{},"Lets edit the file to reflect the following:",[6217,7483,7486],{"className":7484,"code":7485,"language":6222},[6220],"#!\u002Fusr\u002Fbin\u002Fenv node\n\nconst axios = require('axios');\n\naxios.get(`https:\u002F\u002Fhaveibeenpwned.com\u002Fapi\u002Fv2\u002Fbreachedaccount\u002Fadmin@test.com`)\n.then(response=>{\nlet breaches=[]; \u002F\u002Fcreate empty array \n    console.log(`admin@test.com was found in ${ response.data.length} breaches!`) \n    \u002F\u002Fiterate each breaches to get only specific attributes\n    response.data.forEach(breach => {\n        breaches.push({\n            Name:breach.Name,\n            Domain:breach.Domain,\n            BreachDate:breach.BreachDate,\n            AccountsHacked:breach.PwnCount,\n        })\n    });\n    console.table(breaches) \u002F\u002Fdisplay in pretty table! :D \n})\n.catch(err=>{\n    console.log(err)\u002F\u002Fdisplay error\n})\n",[71,7487,7485],{"__ignoreMap":444},[15,7489,7490],{},"Now we should have a better representation of the data we got it should similar to the following:",[15,7492,7493],{},"Great, but this is not dynamic, we have hardcoded the email… How can we change this? Of course by using arguments!",[15,7495,7496],{},"Lets modify the code to the following:",[6217,7498,7501],{"className":7499,"code":7500,"language":6222},[6220],"#!\u002Fusr\u002Fbin\u002Fenv node\n\nconst axios = require('axios');\nconst email = process.argv[2] || 'admin@test.com'; \u002F\u002Fget the email from the arguments or set a default value\naxios.get(`https:\u002F\u002Fhaveibeenpwned.com\u002Fapi\u002Fv2\u002Fbreachedaccount\u002F${email}`)\n.then(response=>{\nlet breaches=[]; \u002F\u002Fcreate empty array \n    console.log(`${email} was found in ${ response.data.length} breaches!`) \n    \u002F\u002Fiterate each breaches to get only specific attributes\n    response.data.forEach(breach => {\n        breaches.push({\n            Name:breach.Name,\n            Domain:breach.Domain,\n            BreachDate:breach.BreachDate,\n            AccountsHacked:breach.PwnCount,\n        })\n    });\n    console.table(breaches) \u002F\u002Fdisplay in pretty table! :D \n})\n.catch(err=>{\n    console.log(err)\u002F\u002Fdisplay error\n})\n",[71,7502,7500],{"__ignoreMap":444},[15,7504,7505],{},"We did it!",[15,7507,7508,7509,7512],{},"We can now query the API for any email we want by running ",[71,7510,7511],{},"pawnhub THE_EMAIL@DOMAIN.TLD"," and check if that email has been compromised! So now what? Well, now we need to do our final step, publish the package on the NPM registry!",[22,7514,7516],{"id":7515},"publish-the-package","Publish the Package",[108,7518,7520],{"id":7519},"authenticate","Authenticate",[15,7522,7523],{},"Well, for obvious reasons you need to create an account to be able to publish to the NPM registry!",[15,7525,7526,7527,917],{},"To create an account in the NPM registry click ",[141,7528,6504],{"href":7529,"rel":7530},"https:\u002F\u002Fwww.npmjs.com\u002Fsignup",[3136],[15,7532,7533,7534,7537],{},"After creating an account, you need to authenticate our self by running the command ",[71,7535,7536],{},"npm login",", you would be prompted to provide our details, you need to enter the required details and you should log in!",[15,7539,7540,7541,7544],{},"To test that the login was successful, enter the command ",[71,7542,7543],{},"npm whoami",", your username should be displayed to the CLI.",[108,7546,7548],{"id":7547},"publish","Publish",[15,7550,7551,7552,7555,7556,7559,7560,7564],{},"Now the final step for our package to be available for the global community! Open the terminal and run the following inside the project directory ",[71,7553,7554],{},"npm publish --access public"," this will publish the package with public access. and will be available on the npm registry. for this example, I have chosen the name to be ",[71,7557,7558],{},"@perlatsp\u002Fpawnhub"," and is now available ",[141,7561,6504],{"href":7562,"rel":7563},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@perlatsp\u002Fpawnhub",[3136],". Make sure that you change the name inside the package.json file!",[15,7566,7567],{},"Boom!💥 Mission accomplished! ✅",[15,7569,7570],{},"We have just learned how to create and publish an NPM package to the NPM registry. The next step is to improve our package by adding more features or fixing any bugs… 🐞",[108,7572,7574],{"id":7573},"test-the-package","Test the Package",[15,7576,7577],{},"Ok, we have published our package..how can we be sure that everything went as intended?",[15,7579,7580,7581,7584,7585,7589,7590,7593,7594,7597,7598,7600,7601,7604],{},"Now on your terminal run ",[71,7582,7583],{},"npm unlink"," to remove the symlink we have created on ",[141,7586,7588],{"href":7587},"#header-n610","this step"," and install our brand new package by running ",[71,7591,7592],{},"npm install -g YOURPACKAGENAME"," I am using ",[71,7595,7596],{},"npm install -g @perlatsp\u002Fpawnhub",". We just installed our package and is globally available via ",[71,7599,6972],{}," (remember this is the package name that I set, yours should be different. Test it by running ",[71,7602,7603],{},"pawnhub any@email.com"," and check the results. For the purpose of this tutorial, we have not done anything for error handling, so in case the email is not valid or does not exist in any databreakch you might get non handled errors.",[15,7606,7607],{},"Now we have just finished this tutorial.",[15,7609,7610],{},"Go and make some create tools and packages! 🙆‍♂️",[15,7612,7613],{},"Let me know if you have any questions! ❓",[15,7615,7616],{},"If you have followed this tutorial please do comment below the awesome tools you have created!",[52,7618],{},[15,7620,7621,7622,917],{},"Need a custom tool, CLI, or web application built? Check out my ",[141,7623,6299],{"href":575},{"title":444,"searchDepth":445,"depth":445,"links":7625},[7626,7627,7628,7629,7630,7633,7641,7642],{"id":6865,"depth":445,"text":6866},{"id":6889,"depth":445,"text":6874},{"id":6958,"depth":445,"text":6959},{"id":6976,"depth":445,"text":6880},{"id":7012,"depth":445,"text":7013,"children":7631},[7632],{"id":7016,"depth":452,"text":7017},{"id":7106,"depth":445,"text":7107,"children":7634},[7635,7636,7637,7638,7639,7640],{"id":7127,"depth":452,"text":7128},{"id":7170,"depth":452,"text":7171},{"id":7209,"depth":452,"text":7210},{"id":7296,"depth":452,"text":7297},{"id":7390,"depth":452,"text":7391},{"id":7419,"depth":452,"text":7420},{"id":7432,"depth":445,"text":7433},{"id":7515,"depth":445,"text":7516,"children":7643},[7644,7645,7646],{"id":7519,"depth":452,"text":7520},{"id":7547,"depth":452,"text":7548},{"id":7573,"depth":452,"text":7574},[477,6479],"2019-06-19","\u002Fimages\u002Fblog\u002FCreate-an-dpublish-npm-packages.png","How to create and publish NPM packages",{},"\u002Fblog\u002Fhow-to-create-and-publish-npm-packages",11,{"title":6856,"description":7655,"ogImage":7649},"Step-by-step guide to creating, testing, and publishing your own NPM package to the registry using Node.js and JavaScript.","blog\u002Fhow-to-create-and-publish-npm-packages",[7658,7659,7660,7038,6612],"axios","haveibeenpawned","javascript","_8j0owbHx2e0xXpEab62zifhDylEb47nK-9n9kcc6yI",{"id":7663,"title":7664,"author":7665,"body":7666,"categories":8266,"cta":487,"date":8267,"description":8268,"excerpt":487,"extension":488,"image":8269,"imageAlt":8270,"meta":8271,"navigation":386,"path":8272,"readingTime":1750,"seo":8273,"stem":8275,"tags":8276,"__hash__":8281},"blog\u002Fblog\u002Fweb-development-environment-using-devilbox.md","Web Development Environment using Devilbox",{"name":8,"avatar":9,"description":10},{"type":12,"value":7667,"toc":8252},[7668,7675,7682,7686,7693,7714,7732,7735,7737,7755,7758,7761,7765,7768,7784,7791,7799,7802,7808,7811,7815,7839,7846,7853,7856,7869,7875,7879,7882,7889,7898,7910,7955,7962,7966,7969,7983,8008,8015,8019,8026,8029,8036,8040,8043,8050,8054,8078,8082,8085,8088,8152,8158,8164,8177,8184,8190,8197,8213,8219,8222,8235,8242,8246,8249],[15,7669,7670,7671,7674],{},"I've always been using WAMP as my local dev environment for a quite amount of time while i was using Windows OS, then I switched to Mac OS and used MAMP for a while. That was the case until one of my colleagues recommended ",[71,7672,7673],{},"devilbox",". I gave it a try, and since then I've been using it as my local dev environment.",[6422,7676,7677],{},[15,7678,7679,7680,917],{},"Looking for a developer who knows modern tooling inside-out? See my ",[141,7681,6299],{"href":575},[22,7683,7685],{"id":7684},"what-is-thedevilbox","What is the Devilbox",[15,7687,7688,7689],{},"No, it does not has to do anything with the devil. As the author describes it in the official ",[141,7690,6909],{"href":7691,"rel":7692},"http:\u002F\u002Fdevilbox.org\u002F",[3136],[6422,7694,7695],{},[15,7696,7697,7698,7704,7705,7099,7709,7713],{},"The Devilbox is a modern and highly customisable ",[91,7699,7703],{"className":7700},[7701,7702],"markup--strong","markup--blockquote-strong","dockerized PHP stack","supporting full ",[91,7706,7708],{"className":7707},[7701,7702],"LAMP",[91,7710,7712],{"className":7711},[7701,7702],"MEAN"," and running on all major platforms. The main goal is to easily switch and combine any version required for local development.",[15,7715,7716,7717,6936,7722,7726,7727,7731],{},"You don’t have to worry if your Operating System will support it. The Devilbox supports ",[91,7718,7721],{"className":7719},[7701,7720],"markup--p-strong","Linux",[91,7723,7725],{"className":7724},[7701,7720],"Mac, ","and ",[91,7728,7730],{"className":7729},[7701,7720],"Windows"," OS!",[15,7733,7734],{},"The Devilbox is running",[22,7736,6880],{"id":6976},[135,7738,7739,7742,7744,7752],{},[33,7740,7741],{},"Computer with decent specs",[33,7743,7009],{},[33,7745,7746,7751],{},[141,7747,7750],{"href":7748,"rel":7749},"https:\u002F\u002Fwww.docker.com\u002F",[3136],"Docker"," Installed",[33,7753,7754],{},"Git Installed",[15,7756,7757],{},"I do believe I do not need to go through the first 2 requirements 😃.",[15,7759,7760],{},"To use the Devilbox you will need to have Docker installed on your computer. For the sake of this article and because I am using Mac OS I will show you how to download and install Docker for Mac.",[108,7762,7764],{"id":7763},"install-docker","Install Docker",[15,7766,7767],{},"There are many ways to install Docker for Mac",[15,7769,7770,7771,7775,7776,7779,7780,7783],{},"One way is to head to ",[141,7772,7773],{"href":7773,"rel":7774},"https:\u002F\u002Fdocs.docker.com\u002Fv17.12\u002Fdocker-for-mac\u002Finstall\u002F#download-docker-for-mac",[3136],"and click ",[71,7777,7778],{},"Get Docker for Mac"," (the preferable version is always stable). When the download is finished open the ",[71,7781,7782],{},"Docker.dmg"," the file you just downloaded and follow the instructions to complete the installation.",[15,7785,7786,7787,7790],{},"The second is to install it via ",[71,7788,7789],{},"homebrew"," the MacOS package manager. To install it open your terminal and type the following command",[15,7792,7793],{},[71,7794,7798],{"className":7795},[7796,7797],"markup--code","markup--p-code","bash",[71,7800],{"className":7801},[7796,7797],[15,7803,7804],{},[71,7805,7807],{"className":7806},[7796,7797],"~ brew install docker",[15,7809,7810],{},"Next step is to run docker and the easiest way to do it is by pressing CMD + SPACE and type docker and then ENTER. You should get a notification when docker is running.",[108,7812,7814],{"id":7813},"install-devilbox","Install Devilbox",[15,7816,7817,7818,7824,7825,7828,7829,7832,7833,7838],{},"The Devilbox does not come with any install package to ",[6780,7819,7823],{"className":7820},[7821,7822],"markup--em","markup--p-em","install"," it you have it ",[71,7826,7827],{},"clone"," the repository to your local machine. To achieve this, we use the command ",[71,7830,7831],{},"git clone REPOSTIORY_URL.git"," the project’s repo is hosted on ",[141,7834,7837],{"href":7835,"rel":7836},"https:\u002F\u002Fgithub.com\u002Fcytopia\u002Fdevilbox",[3136],"GitHub",". Let’s proceed to install devilbox.",[15,7840,7841,7842,7845],{},"Open a terminal window, and type ",[71,7843,7844],{},"git clone https:\u002F\u002Fgithub.com\u002Fcytopia\u002Fdevilbox"," and wait for the cloning process to finish.",[15,7847,7848,7849,7852],{},"When the clone finishes you need to enter the devilbox directory by typing ",[71,7850,7851],{},"cd devilbox"," you should see the following.",[6169,7854,7855],{"id":6694},".ENV file",[15,7857,7858,7859,7861,7862,7865,7866,7868],{},"Because the Devilbox is configurable via a ",[71,7860,6705],{}," file, our next step is to copy the ",[71,7863,7864],{},"env-example"," file to ",[71,7867,6705],{},"to so we can run the following command:",[6217,7870,7873],{"className":7871,"code":7872,"language":6222},[6220],"cp env-example .env\n",[71,7874,7872],{"__ignoreMap":444},[22,7876,7878],{"id":7877},"start-devilbox","Start Devilbox",[15,7880,7881],{},"The time has come, to launch the devilbox!",[15,7883,7884,7885,7888],{},"To launch the devilbox you need to run the following command on your terminal while you are instead the devilbox directory. ",[71,7886,7887],{},"docker-compose up","now it will pull all the required containers! The first time you run this it might take a while, depends on your internet connection. But once you have all the images, you should be able to start all the containers in a matter of seconds (~4-5 seconds).",[6422,7890,7891],{},[15,7892,7893,7894,7897],{},"TIP! Run ",[71,7895,7896],{},"docker-compose up -d"," to run the containers in the background detached from your current terminal window.",[15,7899,7900,7901,7904,7905],{},"When all the images are pulled, you should be able to access devilbox localhost URL. By default, The Devilbox is listening to port ",[71,7902,7903],{},"80"," which means you can access it by visiting ",[141,7906,7909],{"href":7907,"rel":7908},"http:\u002F\u002Flocalhost\u002F",[3136],"http:\u002F\u002Flocalhost",[6422,7911,7912],{},[15,7913,7914,7915,7918,7919,6936,7924,6936,7929,6936,7934,6936,7939,6936,7944,7099,7949,7954],{},"Starting and stopping containers is done via ",[71,7916,7917],{},"docker-compose",". If you have never worked with it before, have a look at their documentation for ",[141,7920,7923],{"href":7921,"rel":7922},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Foverview\u002F",[3136],"overview",[141,7925,7928],{"href":7926,"rel":7927},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Fup\u002F",[3136],"up",[141,7930,7933],{"href":7931,"rel":7932},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Fstop\u002F",[3136],"stop",[141,7935,7938],{"href":7936,"rel":7937},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Fkill\u002F",[3136],"kill",[141,7940,7943],{"href":7941,"rel":7942},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Frm\u002F",[3136],"rm",[141,7945,7948],{"href":7946,"rel":7947},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Flogs\u002F",[3136],"logs",[141,7950,7953],{"href":7951,"rel":7952},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Freference\u002Fpull\u002F",[3136],"pull"," commands.",[15,7956,7957,7958],{},"More about starting The Devilbox ",[141,7959,6504],{"href":7960,"rel":7961},"https:\u002F\u002Fdevilbox.readthedocs.io\u002Fen\u002Flatest\u002Fgetting-started\u002Fstart-the-devilbox.html",[3136],[22,7963,7965],{"id":7964},"configuring-devilboxenvfile","Configuring Devilbox .ENV FIle",[15,7967,7968],{},"Devilbox is configurable and you can easily switch between dev environments like (PHP, APACHE, MySQL) or (PHP, NGINX, MariaDB).",[15,7970,7971,7972,7974,7975,7593,7979],{},"just open the ",[71,7973,6705],{}," file with your favorite editor and configure it to match your taste ",[91,7976,7978],{"className":7977},[7701,7720],"environment.",[141,7980,7982],{"href":6990,"rel":7981},[3136],"Visual Studio Code",[15,7984,7985,7986,7989,7990,7726,7993,7996,7997,8000,8001,7099,8004,8007],{},"Every configuration is self-explanatory, the most common configuration will be the following where you change the ",[71,7987,7988],{},"PHP_SERVER"," version, ",[71,7991,7992],{},"HTTPD_SERVER",[71,7994,7995],{},"MYSQL_SERVER",". As you can see, I am running ",[71,7998,7999],{},"PHP 7.2"," ",[71,8002,8003],{},"NGINX stable",[71,8005,8006],{},"MariaDB 10.3"," Go through the .env file to discover other settings.",[15,8009,8010,8011],{},"Read more about configuring the env file ",[141,8012,6504],{"href":8013,"rel":8014},"https:\u002F\u002Fdevilbox.readthedocs.io\u002Fen\u002Flatest\u002Fconfiguration-files\u002Fenv-file.html",[3136],[22,8016,8018],{"id":8017},"projects-directory","Projects Directory",[15,8020,8021,8022,8025],{},"The devilbox’s projects directory is located inside the devilbox directory ",[71,8023,8024],{},".\u002Fdevilbox\u002Fdata\u002Fwww"," it should be empty by default. Here is where all your projects will live.",[15,8027,8028],{},"For each project, you will need to create a folder.",[15,8030,8031,8032],{},"Read more ",[141,8033,6504],{"href":8034,"rel":8035},"https:\u002F\u002Fdevilbox.readthedocs.io\u002Fen\u002Flatest\u002Fgetting-started\u002Fdirectory-overview.html#project-directory",[3136],[22,8037,8039],{"id":8038},"docroot-directory","Docroot Directory",[15,8041,8042],{},"The docroot directory is a directory within each project directory from which the webserver will serve the files.",[15,8044,8045,8046,8049],{},"By default this directory must be named ",[71,8047,8048],{},"htdocs",". This can be changed as well but is outside the scope of this tutorial.",[22,8051,8053],{"id":8052},"local-domainsuffix","Local domain suffix",[15,8055,8056,8057,8060,8061,8063,8064,8067,8068,8071,8072,8074,8075,8077],{},"The default domain suffix (",[71,8058,8059],{},"TLD_SUFFIX"," variable in ",[71,8062,6705],{}," file) is ",[71,8065,8066],{},"loc",". That means that all your projects will be available under the following address: ",[71,8069,8070],{},"http:\u002F\u002F\u003Cproject-directory>.loc",". This can be changed as well in the ",[71,8073,6705],{},"file ",[71,8076,8059],{},"!",[22,8079,8081],{"id":8080},"wordpress-installation","WordPress Installation",[15,8083,8084],{},"Let us take an example of a WordPress installation from start to the end.",[15,8086,8087],{},"Open the terminal and run the following:",[135,8089,8090,8095,8106,8112,8118,8124,8131,8139,8149],{},[33,8091,8092],{},[71,8093,8094],{},"cd devilbox\u002Fdata\u002Fwww",[33,8096,8097,8100,8101],{},[71,8098,8099],{},"mkdir testwp"," to create a directory named ",[91,8102,8105],{"className":8103},[7701,8104],"markup--li-strong","testwp",[33,8107,8108,8111],{},[71,8109,8110],{},"cd testwp"," enter the dir we just created",[33,8113,8114,8115],{},"Download WordPress ",[71,8116,8117],{},"wget [http:\u002F\u002Fwordpress.org\u002Flatest.tar.gz](http:\u002F\u002Fwordpress.org\u002Flatest.tar.gz)",[33,8119,8120,8121],{},"Unzip the archive file by running ",[71,8122,8123],{},"tar -zxvf latest.tar.gz",[33,8125,8126,8127,8130],{},"Run ",[71,8128,8129],{},"mv wordpress htdocs"," (remember docroot directory?)",[33,8132,8133,8134,8138],{},"Open ",[141,8135,8136],{"href":8136,"rel":8137},"http:\u002F\u002Ftestwp.loc\u002F",[3136]," and you should see the following error.",[33,8140,8141],{},[71,8142,8145,8148],{"className":8143},[7796,8144],"markup--li-code",[91,8146,8147],{},"testwp.loc","’s server IP address could not be found.",[71,8150],{"className":8151},[7796,8144],[71,8153,8155],{"className":8154},[7796,8144],[15,8156,8157],{},"testwp.loc’s server IP address could not be found.",[15,8159,8160],{},[71,8161,8163],{"className":8162},[7796,8144],"DNS_PROBE_FINISHED_NXDOMAIN",[135,8165,8166,8169],{},[33,8167,8168],{},"This happens because we have not added the local host DNS record.",[33,8170,8171,8172,8176],{},"If you navigate to ",[141,8173,8174],{"href":8174,"rel":8175},"http:\u002F\u002Flocalhost\u002Fvhosts.php",[3136]," you should see something like this.",[15,8178,8179,8180,8183],{},"The next step is now to add the record in our hosts file. To do so, run ",[71,8181,8182],{},"sudo nano \u002Fets\u002Fhosts"," to edit it with the nano editor and add the following line",[6217,8185,8188],{"className":8186,"code":8187,"language":6222},[6220],"`127.0.0.1 testwp.loc`\n",[71,8189,8187],{"__ignoreMap":444},[15,8191,8192,8193,8196],{},"hit save. Navigate again to ",[141,8194,8136],{"href":8136,"rel":8195},[3136]," and now you should see the WordPress install page.",[15,8198,8199,8200,8203,8204,8208,8209,8212],{},"Next step now, is to create a database for WordPress to use. We can do it by using the terminal or by using ",[71,8201,8202],{},"PHPMyadmin"," which comes with the devilbox. To access phpMyAdmin first navigate to ",[141,8205,8206],{"href":8206,"rel":8207},"http:\u002F\u002Flocalhost\u002Findex.php",[3136],"> Tools > phpMyAdmin in case it asks for credentials enter ",[71,8210,8211],{},"root"," as user and leave the password field empty.",[15,8214,8215,8216,917],{},"No create a new database from the sidebar, I will name it ",[71,8217,8218],{},"wp_testdb",[15,8220,8221],{},"Once done that head back to WordPress Install Page and continue and add the freshly created database.",[6422,8223,8224],{},[15,8225,8226,8227,8230,8231,8234],{},"Note! For the Database host instead of ",[71,8228,8229],{},"localhost"," you need to enter ",[71,8232,8233],{},"mysql"," as this is the name of the MySQL server (container)running in the devilbox environment!",[15,8236,8237,8238],{},"Everything should have run smoothly and you should see the new WordPress site up and running on ",[141,8239,8241],{"href":8136,"rel":8240},[3136],"http:\u002F\u002Ftestwp.loc",[22,8243,8245],{"id":8244},"conclusion","Conclusion",[15,8247,8248],{},"The Devilbox is a free and open source project very very easy to set up and run an PHP,Nginx MySQL dev environment and a WordPress installation read following this tutorial should take approximately 10 minutes! I have been using Devilbx for about 1 year now, and I am pretty happy with it and find it very convenient when I am working on a project with PHP 7, and I have to switch to a project running on PHP 5.6 it takes me less than 15seconds! ⏲",[15,8250,8251],{},"Have you used The Devilbox before? Would you give it a try?",{"title":444,"searchDepth":445,"depth":445,"links":8253},[8254,8255,8259,8260,8261,8262,8263,8264,8265],{"id":7684,"depth":445,"text":7685},{"id":6976,"depth":445,"text":6880,"children":8256},[8257,8258],{"id":7763,"depth":452,"text":7764},{"id":7813,"depth":452,"text":7814},{"id":7877,"depth":445,"text":7878},{"id":7964,"depth":445,"text":7965},{"id":8017,"depth":445,"text":8018},{"id":8038,"depth":445,"text":8039},{"id":8052,"depth":445,"text":8053},{"id":8080,"depth":445,"text":8081},{"id":8244,"depth":445,"text":8245},[477],"2019-06-03","I've always been using WAMP as my local dev environment for a quite amount of time while i was using Windows OS, then I switched to Mac OS and used MAMP for a while. That was the case until one of my colleagues recommended devilbox. I gave it a try, and since then I've been using it as my local dev environment.","\u002Fimages\u002Fblog\u002Feinstein.jpg","Web development environment using Devilbox",{},"\u002Fblog\u002Fweb-development-environment-using-devilbox",{"title":7664,"description":8274,"ogImage":8269},"The Devilbox is a modern and highly customisable dockerized PHP stack supporting full LAMP and MEAN and running on all major platforms.","blog\u002Fweb-development-environment-using-devilbox",[8277,7673,8278,8279,8280,3007],"container","docker","nginx","php","Y6qKGhjZDBPQdsNBJy1GU6VDGwfkhLx5b256DNdvIOM",{"id":8283,"title":8284,"author":8285,"body":8286,"categories":8315,"cta":487,"date":8316,"description":8317,"excerpt":487,"extension":488,"image":444,"imageAlt":444,"meta":8318,"navigation":386,"path":8319,"readingTime":6485,"seo":8320,"stem":8322,"tags":8323,"__hash__":8325},"blog\u002Fblog\u002Fvuejs-questions.md","VueJS questions",{"name":8,"avatar":9,"description":10},{"type":12,"value":8287,"toc":8313},[8288,8297,8300,8302],[15,8289,8290,8291,8296],{},"Hey all, \nI created ",[141,8292,8295],{"href":8293,"rel":8294},"https:\u002F\u002Fvuejsquestions.com\u002F?ref=cms.kociaj.com",[3136],"VueJS questions ","for common VueJS questions. \nIt is a side project while i started learning UIKIT frontend framework and improving my skills on web performance and SEO.",[15,8298,8299],{},"At the moment it is fetching the questions from stackoverflow. Any feedback will be appreciated negative or positive.",[52,8301],{},[15,8303,8304,8305,8308,8309,8312],{},"I build ",[141,8306,8307],{"href":575},"custom web applications"," with Vue.js and focus on ",[141,8310,8311],{"href":812},"web performance"," from the ground up.",{"title":444,"searchDepth":445,"depth":445,"links":8314},[],[6479],"2019-03-30","Hey all, \nI created VueJS questions for common VueJS questions. \nIt is a side project while i started learning UIKIT frontend framework and improving my skills on web performance and SEO.",{},"\u002Fblog\u002Fvuejs-questions",{"title":8284,"description":8321,"ogImage":444},"I created VueJS questions for common VueJS questions. It is a side project while i started learning UIKIT frontend framework and improving my skills on web performance and seo.","blog\u002Fvuejs-questions",[8324,6852],"side-project","5-v9QpQWcN97nNeuslH5aLY14pU1MecZ7-J8T3q5PMc",{"id":8327,"title":8328,"author":8329,"body":8330,"categories":8392,"cta":487,"date":8393,"description":8334,"excerpt":487,"extension":488,"image":8394,"imageAlt":8395,"meta":8396,"navigation":386,"path":8397,"readingTime":6485,"seo":8398,"stem":8400,"tags":8401,"__hash__":8402},"blog\u002Fblog\u002Fwordpress-database-replacing-the-easy-way.md","WordPress Database replacing the easy way",{"name":8,"avatar":9,"description":10},{"type":12,"value":8331,"toc":8390},[8332,8335,8338,8367,8382,8384],[15,8333,8334],{},"I published an NPM package a small cli tool which does the exporting and replacing the URL for a WordPress website piece of cake. You can export and replace within 10 seconds (depending the size of the database and how fast you type).",[15,8336,8337],{},"I started this as a project for personal use, but decided to make it as an NPM package and publicly accessible. We all know the ritual for WordPress development.",[135,8339,8340,8366],{},[33,8341,8342,8343,8346,8347,8346,8350,8353,8354,8365],{},"Develop local using docker containers- Use git commit, git push (or FTP upload for old school hardcore people) to deploy- open phpmyadmin, find the database,export the database- find the file in the downloads folder (find which one is the latest from ",[71,8344,8345],{},"database (2).sql"," or ",[71,8348,8349],{},"database\n(3).sql",[71,8351,8352],{},"database (5).sql","because you deleted (4)",[135,8355,8356],{},[33,8357,8358,8359],{},"replace the local url with the staging\u002Fproduction url you can do it by:",[6217,8360,8363],{"className":8361,"code":8362,"language":6222},[6220],"  \u003Cli>using any text editor to search\u002Freplace the url or\n  - using a plugin to import and replace url in the database\n      \n          \u003Cli>Install the plugin\n          - Configure the plugin\n          - Run the search\u002Freplace and wait to finish\n          - Done Or do the following while you are in your project directory:\n      \n  \u003C\u002Fli>\n",[71,8364,8362],{"__ignoreMap":444},"\n  ","- run `devild db:export` and follow the instructions to export your database in your current\n      directory\n  - run `devild db:replace` and follow the instructions to replace the url and create another\n      file to keep the original one.\n  - done ( ~10 seconds ⏳ )\n\n",[15,8368,8369,8370,8375,8376,8346,8379],{},"This package is available at ",[141,8371,8374],{"href":8372,"rel":8373},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@perlatsp\u002Fdevild",[3136],"NPM Registry"," where you can install it by running ",[71,8377,8378],{},"yarn global add @perlatsp\u002Fdevild",[71,8380,8381],{},"npm i -g @perlatsp\u002Fdevild",[52,8383],{},[15,8385,8386,8387,8389],{},"Need help with WordPress migrations or ongoing ",[141,8388,1755],{"href":485},"? I offer full-service support for WordPress sites.",{"title":444,"searchDepth":445,"depth":445,"links":8391},[],[6479],"2019-03-14","\u002Fimages\u002Fblog\u002Fdemo.gif","WordPress database URL replacement CLI tool demo",{},"\u002Fblog\u002Fwordpress-database-replacing-the-easy-way",{"title":8328,"description":8399,"ogImage":8394},"An NPM CLI tool that exports and replaces WordPress database URLs in seconds, making site migrations fast and painless.","blog\u002Fwordpress-database-replacing-the-easy-way",[7660,6612,8324,3007],"W5Y4LYzfhWHc6Xu7sf2Duvso9Dku-Q3IB_oUrSjVswg",1777945231139]