Blogging [Journey] for Translating the Failures into Success

kalolpati

Newbie
Joined
Oct 23, 2020
Messages
15
Reaction score
7
I'm the failed piece of shit that fails to stink. I tried creating multiple blogs and failed. I'm starting this thread to keep track of my past failures and keep trying until I succeed. Here is the story of what I've done in the last four years:

Website 1:
  • Used Hugo and Github to host the blog.
  • Written five blog articles.
  • Enabled Google Analytics.
  • No impressions & no visitors.
  • This fucking noob was high on expectation for the site visitors and got heartbroken.
  • The domain expired for the greater good!!!
Website 2:
  • I started reading about SEO, page speed, and the greatness of WordPress.
  • Enrolled into five year WordPress hosting plan for 200 fucking $$$.
  • Purchased a lifetime Divi subscription for God knows how many fucking $$$.
  • Added 19 blog articles.
  • Enabled Google Analytics.
  • I observed the website's visitor number to be close to 20.
  • I used incognito mode while setting up menus using the Divi extra theme and was counted as an additional visitor.
  • Found out that the domain I had purchased was used for spamming earlier. I didn't do any research before buying the name. I was not aware of all that stuff.
  • Three months later, I was staring at 0 visitors.
  • The domain expired for the greater good!!!
Website 3:
  • Read that bigger articles rank better. So I was high on Bigger the Better drug.
  • I also drank the AI Cool-Aid. I developed my own scripts to write the articles using OPENAI models. The script also fetched the images from Flicker and Pixabay. I used a few open-source CV models to identify the picture with the highest aesthetic. The pop-up window on my screen allowed me to select the image I wanted by looking at the aesthetic score.
  • Posted 80 articles with 226,463 words
  • 1702916727799.png
  • Installed RankMath free version. I tried to maximize the rank math score for every article.
  • Subscribed to Grammarly Premium to fix the sentences wherever required.
  • It's been a year. The blog is collecting dust and eating the spam messages from the Vodka drinkers.
  • 61 Impressions in the last 28 days. 0 Clicks.
  • 1702916798592.png
  • I'll not allow this domain to ever expire. I'll keep paying for the web hosting and domain like a psycho boyfriend refusing to accept that his love was one-sided.
Website 4:
  • Read that FAQs help with web traffic if added with proper schema.
  • I made a custom code to add the FAQ schema to each page header.
  • Published 242 articles with fucking 644,189 words.
  • 1702916858218.png
  • I dreamed that my second income stream would start any day now. I was dreaming that Google would soon allow me in between her legs finally. I was fucked hard without lubs instead.
  • I even made a big post with approximately 26000 words. Google doesn't take note of my hard work. The post remains unindexed to this day.
  • 3.01K Impression and 12 clicks in the last 28 days. WTF man!
  • 1702916935136.png
  • I'll keep paying for this domain and web hosting for eternity now.
Website 5
  • I read the internal links help the SEO.
  • This was a short-lived project. The aim was to do some quick experiments.
  • Added random 40 articles quickly. It was heavily interlinked (average of 14 incoming internal links).
  • Google refused to index almost all content and only indexed 4 articles out of 40.
  • 1702917063842.png
  • I rage deleted the WordPress site completely. No backup was taken. Zero fucks given.

What is the plan now?
The plan now is to learn the real SEO. This will require experimentation, time, and money. I'm willing to invest more time and (limited) money to know about SEO.

Do I have enough money for an Ahref and Semrush subscription?
Nope.

Do I have access to a few useful paid themes and plugins?
Yes. Thanks to Deleted member 752298 .

Note to self:
  1. Do not fire blindly in the air and expect the headshot. Decide on the blog category first. Decide on how to establish the topical map authority.
  2. Do not watch any YouTube video titled 'How I Ranked My Article at Second Place in 5 Hours.' The fucker already ranked fourth on Google and didn't say a word about how he did that.
  3. Everyone out there is to rob you of your money. Please only buy the services if you know it's worth it.

I'm on my sixth attempt now. I'll follow good SEO practices. I'll ensure the generated contents are helpful to the user and are considered high-quality.

If you're not one of those Note to Self #2 fucker, your suggestion, comments, and feedback are welcome and appreciated.

My luck is broken, as is my English. Wish me luck, fellas!!!
 
What I love about this thread is that you're actively seeking to learn from your past setbacks

REMEMBER: There is no such thing as failure... only LESSONS that needed to be learned.

This is why it's a good idea to learn those lessons as quickly as possible or to put it in old/inaccurate terms: fail quickly and move up
 
Nicely detailed. Wish you the best
Thank you!!!

What I love about this thread is that you're actively seeking to learn from your past setbacks

REMEMBER: There is no such thing as failure... only LESSONS that needed to be learned.

This is why it's a good idea to learn those lessons as quickly as possible or to put it in old/inaccurate terms: fail quickly and move up
Agreed.
 
Update 2:

While most other journies jump directly into numbers, I'm here to learn from and improve on previous mistakes. I'll not have any numbers (impression, clicks, CTR, etc) till mid-2024, except for the hours I spent learning and experimenting. I'll happily share the lessons learned, though.

Here is the plan I started working on:

Content Generation Script:
1. Rewrite the Content Generation script using Langchain.

2. The script must connect to the Google keyword planner using the Google client API library and get keyword ideas using seed keywords.

3. The search engines usually display different results in different regions. Fetch the top 20 search results for each keyword in targeted areas. I may need to use a proxy for this.

4. Perform keyword density analysis and see how keywords are distributed in headers, sub-headers, and content.

5. Keep track of what the articles are about for each keyword. Use LLMs to generate similar content ideas.

6. Generate the article outline first. Ask LLMs to generate one sub-section at a time. Use advanced long-chain functionality like memory to track what has been added to different article sections.

7. Prompt engineering is an essential aspect of this development. Ensure the generated titles, blog excerpts, and contents follow the general SEO guidelines provided by RankMath.

8. The script must fetch the images from Pixabay/Unsplash or create new images using GenAI. The script must be able to add the SEO-optimised description and alt-text automatically.

9. The average article length must be 2000 words. The content pillar length must be 12000+.

10. The generated article must contain the outbound links to relevant websites.

11. The script must be configuration-driven. The script must be able to publish the article in the Draft state.

12. Keep track of articles generated so far. Add smaller related articles that can link to the medium-length articles. Ensure that the content is not being duplicated just for internal linking.


Blog Setup
1. Search for good domain name. It must not have any recent history, as I'm trying to start fresh.

2. There are many articles suggesting that page speed matters a lot. Google switched to a mobile-first search engine a few years ago. The page speed must be 90+ both on desktop and mobile.

3. Finalise if I should continue using Divi extra theme or switch to GeneratePress. I have tried using the following theme and optimization plugin combinations so far. The results are more or less the same.
a. Divi extra + Litespeed free
b. Divi extra + WP rocket
c. GeneratePress (scribe/read) + LiteSpeed Free
d. GeneratePress (scribe/read) + WPRocket.

Though I'm tempted to settle on #3.a, I couldn't find any natural way to enable the AMP when using the Divi extra theme. This could be a make-or-break thing for page speed.

4. All the categories must have associated descriptions stuffed with SEI keywords. The same goes for the tags.

5. Each article must contain the FAQ. Enable rank math FAQ schema on each article.

6. Enable article interlinking using plugins like Link Whisper.

7. Manually fix any suggestions provided by Grammarly Premium before publishing.

8. Create 4-5 author personas and randomly use any persona for the author.

9. Research the article scheduler to make it look like the site publishes the articles regularly.

Expected Time for the redevelopment of the content generator script:
2 Months: I know it is a lot, but I do have a full-time job

Meanwhile, I'll experiment with Websites 3, 4, and 5. The experimentation and the lessons will make website six better.
 
Keep going. I think you took the ideas a bit too far previously, there's no need for 3k+ word articles, let alone 26k words :eek:. Domain is probably the most important when you're starting out. Always check the history, because most domains have been used as spam sometime in the past. I'd suggest you learn everything you can about how to do keyword research and topical authority.

Anyways, I hope you succeed.
 
Keep going. I think you took the ideas a bit too far previously, there's no need for 3k+ word articles, let alone 26k words :eek:. Domain is probably the most important when you're starting out. Always check the history, because most domains have been used as spam sometime in the past. I'd suggest you learn everything you can about how to do keyword research and topical authority.

Anyways, I hope you succeed.

Lesson learned the hard way! Thanks!!
 
Good luck little buddy

For the greater good, love the movie Hot Fuzz

for keyword research maybe buy a 14-day Semrush trial, some sellers are on here. I bought one recently
 
Is there a way to have the data training use actual READER ENGAGEMENT cues?
I'm talking about using Machine Learning to do this
 
You need to be patient to be successful in blogging.

Here are some things I follow (If you feel like to know):
  1. Work daily on site.
  2. Make a content plan by targeting specific topics first (Try Silo structure if possible).
  3. Grow your social accounts along with it. It will help to get some traffic and engagement to the site.
  4. Focus on Offpage SEO for each month.
  5. Don't expect results for the first 6 months to 1 year.
There are several other things to consider, but I want to highlight a few key points first.

Following your journey,
Cheers..!
 
for keyword research maybe buy a 14-day Semrush trial, some sellers are on here. I bought one recently
I will start looking into it once a content generation script is ready. Thanks for the suggestion.

Is there a way to have the data training use actual READER ENGAGEMENT cues?
Assuming you're looking to see how your visitors use your website (click stream data), you can use Microsoft Clarity. It might not be machine learning, per se, but it could be helpful.

Thanks, @anup999 for the suggestions.
Work daily on site.
Agree. Consistency is the key. I'm trying to be consistent, as consistent as one's heart. One heartbeat here and there; the consequences are grave.

Make a content plan by targeting specific topics first (Try Silo structure if possible).
Is there a way to tell Linkwhisper pro about the silo?

Grow your social accounts along with it. It will help to get some traffic and engagement to the site.
I will do that; thanks!

  1. Focus on Offpage SEO for each month.
What specific things should I look for off-page SEO every month?

Don't expect results for the first 6 months to 1 year.
Agree.
 
Is there a way to tell Linkwhisper pro about the silo?
I never used Linkwhisper so don't know about this. I'm doing it manually for my sites.

What specific things should I look for off-page SEO every month?
Link building is very important for a blog. So make a link-building plan as you plan for content posting.
The approach I follow for each blog post is researching my competitors and planning a better link structure than theirs.
 
Update 3
Update type: Quick Update

In the future, I'll post two updates: Quick and detailed.

Quick Update:
As the name suggests, these will be quick, short, and frequent updates.

Detailed Update:
These updates will provide more detailed updates like what has been implemented so far, experimentation, and the results. These will be long but infrequent updates since the experiment and results take time.

Today's Update:
I'm resurrecting the content generation script I wrote last year. The Generative AI field is processing with breakneck speed, and there's so much to catch up on. How the Lanchain Library has evolved in the last six months is crazy. I want to use Google Adwards API to fetch related keywords and get keywords from high-ranking pages. The Google Adwords APIs are free but have a limit of 10000 calls daily. I'll continue working on this part.

Contributing back to BHW:
I'm getting much value from the BHW forum and would like to contribute. While I may not be able to share the complete end-to-end content generation scripts, I'm more than happy to share a few auxiliary scripts you may find helpful. You can pretend that you have written the scripts independently and tweak how you want them to fit your use case.

I am sharing the code to generate the FAQs with FAQ schema. Please note that I might be unable to modify the script to fit your use case.

Python:
"""Python class to Generate FAQs using openAI API"""
import asyncio
import logging
import os

from aiohttp_retry import ExponentialRetry, RetryClient
from aiolimiter import AsyncLimiter
from jinja2 import Template

logging.basicConfig()
logging.root.setLevel(logging.DEBUG)
logger = logging.getLogger(__name__)

FAQ_TEMPLATE = """<REPLACE_THIS>"""
OPENAI_COMPLETE_URL = "https://api.openai.com/v1/completions"


class FAQGenerator:
    """Class to generate FAQs"""

    def __init__(self, openai_engine="text-davinci-003"):
        self.openai_engine = openai_engine
        self.auth_token = os.environ["OPENAI_API_KEY"]

    def get_headers(self):
        """Function to get header"""
        headers = {
            "Authorization": f"Bearer {self.auth_token}",
            "Content-Type": "application/json",
        }
        return headers

    @staticmethod
    def get_prompt_params(
        context,
        model="text-davinci-003",
        temperature=0.7,
        max_tokens=1024,
        top_p=1,
        frequency_penalty=0.0,
        presence_penalty=0.0,
    ):
        """Function to get prompt params"""
        prompt_params = {
            "model": model,
            "prompt": context,
            "temperature": temperature,
            "max_tokens": max_tokens,
            "top_p": top_p,
            "frequency_penalty": frequency_penalty,
            "presence_penalty": presence_penalty,
        }
        return prompt_params

    async def generate_questions(self, context, max_tokens=1024):
        """Function to generate questions from context"""
        retry_options = ExponentialRetry(attempts=5)
        retry_client = RetryClient(raise_for_status=False, retry_options=retry_options)
        async with retry_client.post(
            OPENAI_COMPLETE_URL,
            headers=self.get_headers(),
            json=self.get_prompt_params(context, max_tokens=max_tokens),
        ) as response:
            res = await response.json()
        await retry_client.close()
        return res["choices"][0]["text"]

    @staticmethod
    def process_questions(questions):
        """Function to process questions"""
        questions = questions.split("\n")
        questions = [question.strip() for question in questions]
        questions = [question for question in questions if question]
        questions = [question.split(". ", 1)[-1] for question in questions]
        questions = list(set(questions))
        return questions

    async def fetch_answer(self, ses, prompt, max_tokens=256):
        """Function to fetch answer from OpenAI"""
        async with ses.post(
            OPENAI_COMPLETE_URL,
            headers=self.get_headers(),
            json=self.get_prompt_params(prompt, max_tokens=max_tokens),
        ) as resp:
            response = await resp.json()
            ret = {"question": prompt, "answer": response["choices"][0]["text"]}
            return ret

    async def generate_answers(self, questions, max_tokens=256):
        """Function to generate answers from questions"""
        limiter = AsyncLimiter(1, 60)
        op = []
        retry_options = ExponentialRetry(attempts=5)
        retry_client = RetryClient(raise_for_status=False, retry_options=retry_options)
        async with retry_client as ses:
            tasks = [
                self.fetch_answer(ses, question, max_tokens) for question in questions
            ]
            while tasks:
                async with limiter:
                    to_run, tasks = tasks[:15], tasks[15:]
                    output = await asyncio.gather(*to_run)
                    op.extend(output)
        await retry_client.close()
        return op

    @staticmethod
    def process_answer(answer):
        """Function to process answer"""
        res = ""
        if (not answer.startswith("\n\n1. ")) and (not answer.startswith("\n1. ")):
            answers = answer.split("\n")
            answers = [answer.strip() for answer in answers]
            answers = [answer for answer in answers if answer]
            answers = list(set(answers))
            res = ". ".join(answers)
        else:
            answers = answer.split("\n")
            answers = [answer.split(". ", 1)[-1] for answer in answers]
            answers = list(set(answers))
            answers = [answer for answer in answers if answer]
            answers = [answer.strip() for answer in answers]
            res = ", ".join(answers)
        return res

    @staticmethod
    def get_faq_schema(faqs):
        """Function to get FAQ schema"""
        template = Template(FAQ_TEMPLATE)
        schema = template.render(faqs=faqs)
        return schema

    def execute(self, context):
        """Driver function to generate FAQs"""
        logger.info("Generating questions...")
        questions = asyncio.run(self.generate_questions(context))
        questions = self.process_questions(questions)
        logger.info("Questions: {}".format(questions))
        logger.info("Generating answers...")
        q_a = asyncio.run(self.generate_answers(questions))
        processed_q_a = [
            {"question": qa["question"], "answer": self.process_answer(qa["answer"])}
            for qa in q_a
        ]
        schema = self.get_faq_schema(processed_q_a)
        return processed_q_a, schema

Please make the following changes if you're using the above script.
  • The script uses an older and more costly OpenAI model. Switch the model to the latest.
  • You may need to modify the process question and process answer function per model change.
  • The code uses async functionality to save some time. You may quickly blow up the budget if you are not using it correctly.
  • You can embed the generated FAQ schema into the header of the page.
  • Please validate the generated FAQ schema using the online schema validator tools.
  • The Python code block was not allowing the Jinja template for FAQ. Replace the variable value with the following.
Code:
FAQ_TEMPLATE = """<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{% for faq in faqs %}{"@type": "Question", "name": {{faq.question|tojson}}, "acceptedAnswer": {"@type": "Answer", "text": {{faq.answer|tojson}}}}{{ "," if not loop.last }}{% endfor %}]}</script>"""

Sample call for FAQ script:
Python:
def get_faq(faq_context):
    """Get FAQs"""
    faq_generator = FAQGenerator()
    # faq_context = "Write 20 FAQs asked by developers about Python."
    q_a, schema = faq_generator.execute(faq_context)
    return q_a, schema


Disclaimer: I'll not be responsible if you use the scripts in an infinite loop and blow up your OPENAI budget. Please use it with caution.
 
Back
Top