Skip to content
SEOBlogBotSign up

Runbook

Post-publish link audit with GitHub Actions or plain cron

The post is live and the pipeline is not finished. This runbook adds a scheduled audit that records link data per site and tells a person only when something looks wrong.

SEOBlogBot research team ·

Why audit after publishing at all

Gates catch drafts. Audits catch reality.

Plugins rewrite links, editors paste affiliate redirects over your clean URLs, and a CDN migration can turn a host into something else. None of that exists at the draft stage, and a post-publish run is the only place it can show up before a reader reports it.

There is no official Google backlink checker API for general use, which is why teams call a third-party link index instead; ours is built on our own crawler. Search Console shows Google's view of your own links, and the audit complements it rather than replacing it.

The runbook, in order

  1. 1

    Trigger on publish and again 30 days later

    One run right after the post is live checks the outbound hosts. A second run a month later reads refdomains for your site, because the index refreshes roughly monthly and an earlier read would show nothing new.

  2. 2

    Call the free overview first

    action=overview returns the site's headline numbers at no cost. Store them as the baseline row for the run.

  3. 3

    Pull the paid lists only on change

    If the overview differs from last month, call refdomains (2 credits) and anchors (2 credits) and diff against the stored lists.

  4. 4

    Write one line to a log

    Date, post URL, calls made, _credits balance. A plain CSV committed to a private repo is enough.

  5. 5

    Alert on exceptions only

    HTTP 401, HTTP 402, an empty result for a site that had rows last month, or a rating drop of 10 points or more.

Which sites to audit

Your own first.

Run the audit against the domain that hosts the post, then against two or three peers you want to benchmark with compare, which takes up to 20 domains for 1 credit. Skip the long tail: every extra site adds noise to a log that a person has to read.

A workflow file to start from

Store the key as a repository secret named SBB_KEY. The cron expression runs on the first of each month at 06:00 UTC.

yaml
name: monthly-link-audit
on:
  schedule:
    - cron: '0 6 1 * *'
  workflow_dispatch: {}
jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Overview (free)
        run: |
          curl -fsS "https://seoblogbot.com/api.php?action=overview&q=example.com" > overview.json
      - name: Refdomains (2 credits)
        env:
          SBB_KEY: ${{ secrets.SBB_KEY }}
        run: |
          curl -fsS -H "Authorization: Bearer $SBB_KEY" \
            "https://seoblogbot.com/api.php?action=refdomains&q=example.com&per=500" > refdomains.json
      - name: Log credits
        run: jq -r '._credits' refdomains.json >> credits.log

What goes wrong and what the log shows

SymptomLikely causeFirst move
HTTP 401Secret missing or rotatedRe-create the secret, run workflow_dispatch
HTTP 402Credit ran outTop up from the account page, re-run
Empty rows for a known siteIndex refresh in progress or typo in the domainRetry in a day; check for www.
Rating moved a few pointsMonthly refreshDo nothing; look at the trend
Rating dropped 10+Lost links or a big refresh changePull refdomains and diff
Cron on a plain server

The same three commands run from a crontab line. Keep the key in an environment file readable only by the job's user, and log to a file you rotate.

Costs and where to read them

Cheap, but not free.

A monthly audit for one site is 4 credits when you pull both lists, which is $0.0004, and the overview call is free. The larger cost is your CI provider's minutes, and the cost table puts both lines next to each other so you can decide which one to optimise.

Ask the first run to print _credits so you can confirm the real number on your account instead of trusting a table. After that, see the gate guide for the draft-side check.

Runbook sign-off

  • The secret exists and the workflow has run once by hand.
  • The log file records date, URL, calls and _credits.
  • Someone owns the alert channel.
  • The job treats monthly data as monthly.
  • A failure of the audit itself pages a person.