Recept
Volg backlinks met een weekelijkse diff die je in een minuut kunt lezen
Ophalen, opslaan, vergelijken, posten. Het hele recept bestaat uit één Python-bestand, een map met gedateerde JSON-bestanden en een cron-regel.

Het recept, van begin tot eind
- 1
Maak de sleutel aan
Log in met Google, maak een sleutel aan op de accountpagina en exporteer deze als
RANKIFT_KEY. Commit deze nooit naar de repo. - 2
Kies de actie
refdomainsvoor de diff op domeinniveau, wat de meeste alerts nodig hebben. Gebruikbacklinksalleen als je URL's en ankers nodig hebt, voor dezelfde kosten van 2 credits. - 3
Sla gedateerde snapshots op
Eén bestand per domein per run, genoemd met de datum. Schijfruimte is goedkoop en oude bestanden helpen je vragen te beantwoorden die nog niet zijn gesteld.
- 4
Diff en post
Vergelijk de twee nieuwste bestanden, print wat is verdwenen en wat is bijgekomen, en sluit rustig af als beide lijsten leeg zijn.
- 5
Plan het
Cron op maandagochtend. Voeg een melding bij falen toe, want een stille monitor is erger dan geen monitor.
diff.py
Getest tegen de gedocumenteerde parameters: action, q, per, page en key. De responsstructuur verschilt per actie, dus print één echte respons en stel ROWS en ID in om te matchen voordat je erop vertrouwt.
import json, os, sys, glob, urllib.parse, urllib.request
KEY, SITE = os.environ['RANKIFT_KEY'], 'https://rankift.com/api.php'
ROWS, ID = 'rows', 'domain' # adjust after inspecting one response
def pull(domain):
out, page = [], 1
while True:
qs = urllib.parse.urlencode({'action': 'refdomains', 'q': domain,
'per': 1000, 'page': page, 'key': KEY})
with urllib.request.urlopen(f'{SITE}?{qs}') as r:
batch = json.load(r)[ROWS]
out += batch
if len(batch) < 1000 or page >= 5: # five pages = 5,000 rows
return out
page += 1
domain, date = sys.argv[1], sys.argv[2]
json.dump(pull(domain), open(f'snap/{domain}-{date}.json', 'w'))
files = sorted(glob.glob(f'snap/{domain}-*.json'))
if len(files) > 1:
old = {r[ID] for r in json.load(open(files[-2]))}
new = {r[ID] for r in json.load(open(files[-1]))}
lost, gained = sorted(old - new), sorted(new - old)
if lost or gained:
print(f'{domain}: -{len(lost)} +{len(gained)}')
print('lost:', lost[:25])Waarom een diff beter is dan een dashboard
Een grafiek laat zien dat de lijn is verplaatst. Een diff laat zien welke domeinen zijn verplaatst, wat het ding is waarop je actie kunt ondernemen.
Gereedschappen zoals Ahrefs en Semrush tonen nieuwe en verloren links in hun eigen interface, en voor ad hoc-werk is dat prima. Het probleem begint bij vijftig sites en één analist, wanneer het maandagritueel van het openen van elk project de ochtend opslokt.
Een script verandert dat ritueel in een bestand. Het laat ook een gedateerd archief achter, zodat je in maart kunt beantwoorden hoe het profiel er in oktober uitzag zonder een leverancier om een export te hoeven smeken.
De cron-regel
Voert maandag om 07:00 servertijd uit en mailt alle output naar je, vandaar dat het script niets print als er niets is veranderd.
0 7 * * 1 cd /srv/linkwatch && for d in example.com rival-one.com rival-two.com; do python3 diff.py $d $(date +%F); done | mail -s 'link diff' your-team-listWat het kost
| Instellen | Calls per week | Credits per week | Per jaar |
|---|---|---|---|
| 1 domein, minder dan 1.000 verwijzende domeinen | 1 | 2 | ongeveer $0.01 |
| 1 domein, 4.000 verwijzende domeinen | 4 | 8 | ongeveer $0.04 |
| Jouw site en 5 concurrenten, 1 pagina elk | 6 | 12 | ongeveer $0.06 |
| 50 klant-sites, 1 pagina elk | 50 | 100 | ongeveer $0.52 |

Valkuilen die we tegenkwamen, zodat jij ze vermijdt
Snapshots veranderen alleen als de index verandert. We vernieuwen ongeveer maandelijks, dus de meeste wekelijkse runs geven een identieke lijst en printen niets. Dat is opzettelijk. Stilte is het verwachte resultaat.
Diepe paginering is beperkt tot 50.000 rijen, en de limiet van vijf pagina's in het script houdt je ver daarvan weg. Grote domeinen vereisen een ander plan: sorteer met sort en order=desc op een veld dat de actie accepteert, en stop vroeg zodra de rijen niet langer interessant zijn.
Voer de eerste pull handmatig uit en lees de JSON. Controleer de veldnamen. Vergelijk vervolgens het aantal rijen met het totaal van verwijzende domeinen uit één respons van de gratis overview-actie, als die respons er een bevat.
Verwerk HTTP 401 en 402 expliciet, omdat 401 betekent dat de sleutel fout is en 402 betekent dat het saldo nul is bereikt. Beide behoren tot je melding bij falen. Wanneer een diff wel afvinkt, volg dan het lost links runbook voor het eerste uur.
Een gekochte linkcampagne meten, snapshot voor snapshot
Links kopen zonder baseline is een veelvoorkomende manier om te eindigen met een cijfer dat je niet kunt verdedigen. Maak de snapshot voordat de eerste plaatsing live gaat, en bewaar deze naast elke volgende snapshot.
Vergelijk vervolgens verwijzende domeinen, geen ruwe aantallen, omdat één donor veel links kan dragen. Elke nieuwe rij in de diff is één site die je handmatig kunt openen en controleren.
Een campagne die een maand lang vlak lijkt, is niet automatisch een mislukking. Indexvernieuwingen zijn traag, dus de diff loopt achter op wat er op de live pagina's is gebeurd, en die vertraging is onderdeel van de methode.
Hoe meet ik of gekochte backlinks hebben gewerkt?
Begin bij de datum van de eerste plaatsing en zoek naar donor-rijen die daarna verschijnen. Tel alleen diegenen mee die in de volgende twee snapshots aanwezig bleven. Stel dat aantal vervolgens af tegen wat je voor de plaatsingen hebt betaald, en noteer het resultaat naast de datums.
Wat moet de snapshot voor een aankoop bevatten?
De volledige lijst van verwijzende domeinen, opgeslagen in hetzelfde bestandformaat als elke latere run, met de datum en het domein in de bestandsnaam. Een baseline in een ander formaat kan niet worden gediffd, en dat is de ene fout die je achteraf niet kunt herstellen.

Hoe ziet een luidruchtige week eruit in de diff
Een week met duizenden nieuwe rijen is niet altijd een crisis. Vaak zijn het scrapers. Ze kopiëren pagina's, en kopieën creëren links die niemand heeft geplaatst. Controleer de donor eerst voordat je iets aannemt over je eigen site.
Sorteer de nieuwe rijen op donor-kwaliteit voordat je ze leest. Het grootste deel van de lijst is meestal ruis, en een korte blik op de bovenste rijen vertelt je of de piek de rest van je ochtend waard is.
Als de rijen scraper-pagina's zijn, noteer dan het aantal en ga verder. Als het echte sites zijn met links naar je money pages, volg dan de triage-stappen.
Waarom toont de diff winsten uit spam?
Omdat de diff rapporteert wat in de index is verschenen, niet wat een mens heeft gekozen. Spam die de index heeft opgepakt, ziet eruit als een redactionele link totdat je de donor-pagina opent en deze leest.
Hoe vaak moet ik disavow-kandidaten reviewen?
Maandelijks past beter bij het indexritme dan dagelijks. Een dagelijkse review toont meestal weer dezelfde lijst, terwijl een maandelijkse review elke kandidaat de tijd geeft om opnieuw te worden gecrawld voordat je het oordeelt. De pagina spam links triage bevat de beslissingsstappen.
Voordat je de eerste diff vertrouwt
- De eerste pull is handmatig gelezen, rij voor rij, voor ten minste één pagina.
- Veldnamen komen overeen met de constanten bovenaan het script.
- Een 401 en een 402 laten de taak luidruchtig falen, niet stil.
- De snapshot-map is ergens back-up of gesynchroniseerd waar je het kunt herstellen.
- Iemand anders dan de auteur heeft de eerste alert gezien en is het ermee eens dat het het waard is om een bericht te sturen.
Houd het snapshot-archief een jaar lang nuttig
Bewaar elk gedateerd bestand, ook diegenen die onveranderd lijken. Een jaar aan wekelijkse snapshots neemt weinig schijfruimte in beslag, en het beantwoordt vragen die nog niet zijn gesteld, zoals wanneer een donor voor het eerst verscheen.
Noem bestanden consistent, met het domein, de datum en de actie. Gemengde namen zorgen ervoor dat het diff-script het verkeerde paar kiest, en een verkeerd paar produceert een zelfverzekerde en foute alert.
Comprimeer oudere bestanden eens per kwartaal als ruimte belangrijk is. Houd de nieuwste twaalf ongecomprimeerd, zodat de wekelijkse taak nooit hoeft te wachten op een archief.
Hoe vind ik de eerste snapshot waarin een donor verscheen?
Sorteer de gedateerde bestanden op naam, en zoek in elk bestand naar het donor-domein tot de eerste hit. Een korte lus doet dit in een paar regels, en het resultaat is slechts zo goed als de naamgeving die je vanaf het begin hebt gehandhaafd.
Wat moet ik verwijderen, en wat moet ik bewaren?
Bewaar elke snapshot waarop een beslissing is gebaseerd, plus de eerste en laatste van elke maand. Verwijder de rest pas nadat het archief is gecontroleerd, omdat een verwijderd bestand later geen vraag meer kan beantwoorden.
Stuur de diff waar mensen al lezen
Een diff die in een ongelezen map belandt, heeft geen waarde. Delen is beter dan privé. Post het resultaat in het kanaal dat je team al volgt, en houd het bericht kort genoeg om in één oogopslag actie op te ondernemen.
Een goed bericht noemt het domein, het aantal verloren en gewonnen rijen, en de eerste stap. Het laat de volledige lijst weg, die in het bijgevoegde bestand hoort.
Stilte in een rustige week is onderdeel van het ontwerp. Als er niets is veranderd, hoeft niemand eraan herinnerd te worden dat er niets is veranderd. Houd het zo. Het kanaal blijft leesbaar voor de volgende echte alert.
Wat moet het bericht bevatten?
Drie dingen: de donor- of rivalenaam, de twee aantallen en een link naar het opgeslagen bestand. Wanneer een score is toegevoegd, voeg dan de beste Domain Rating toe tussen de nieuwe rijen, omdat één sterk domein de prioriteit meer verandert dan tien zwakke.
Wie krijgt de falingsmelding?
Iemand die de taak kan oplossen, niet alleen iemand die de berichten leest. Een 401 vereist een nieuwe sleutel, en een 402 vereist een opwaardering vanaf de accountpagina. Geen van beide wordt opgelost door te wachten tot de volgende maandag.
Uitbreiden
Vervang refdomains door backlinks wanneer de alert de donor-URL en het anker nodig heeft. Houd dezelfde kosten van twee credits in gedachten.
Voeg bulk_dr toe om elk nieuw domein te scoren, tegen één credit per call van maximaal 2.000 domeinen. Dan kan je bericht "3 nieuw, beste DR 72" zeggen in plaats van een kale lijst.
Voor Google Sheets werkt dezelfde querystring in Apps Script met UrlFetchApp. En voor concurrenten, gebruik de drempelwaarden uit competitor backlink alerts.