Getting readwise data into an automation
If you’ve ever tried to pipe your Readwise highlights straight into something like Notion or a Google Sheet without touching them manually, you already know the first sync feels like magic and then immediately breaks the next day. My first Zap that pulled Readwise highlights into Airtable worked fine until one morning it just… skipped every new highlight. No errors. No logs that made sense. Just empty cells where my text should have gone. ¯\\_(ツ)_/¯
The easiest first step for a beginner is usually to go into Readwise settings and look for the export token. It’s basically a password for your automations, but it only works for their API. Once you have that, test the API in a browser tab by replacing the token in their example URL and seeing JSON text appear. If that page loads gibberish-looking brackets and quotation marks, that’s good. From there you can feed that into Zapier’s Webhooks by Zap app. The key is setting the request to GET and mapping the right field — I once spent thirty minutes wondering why nothing came through only to realize I was returning the creation date, not the highlight text.
A quick tip if you’re new: highlights come back in pages, so if you have hundreds of them you’ll only see the first batch unless you set up some looping step. This is the part that trips up most beginners because the automation will run happily but silently never touch older items.
Breaking the loop problem before it starts
When you first hear the term pagination, it sounds like something you could ignore for small data, but even ten highlights might unexpectedly split into more than one page depending on your settings. I learned this when I kept seeing the same five quotes over and over in my Notion table. Turned out Zapier wasn’t naturally looping the GET request; it just grabbed one set while tossing the rest away.
For a manual beginner fix, you can cheat by lowering the API limit parameter so you knowingly grab smaller batches and test your loop. In Zapier, that means adding a “Looping by Zapier” step after the initial GET. Then set it to loop through each record (in the case of Readwise, that’s each JSON object inside the ‘results’ field). You can pass that loop item directly into the Notion create block without worrying about missing half your data.
One thing I messed up early was forgetting that the loop length is fixed at the run start — so if you pull in ten items and halfway through they update or change, that run won’t see the changes. That’s fine for reading highlights but will make you pull your hair out if you try to do fancy two-way sync. 😛
Cleaning highlight text before it hits your destination
Even if your Zap runs perfectly, dumping raw highlight text straight into a doc or database can make a mess. Readwise sends the content exactly as you grabbed it (including weird dash characters or spaces that look normal but break sorting). This really gets annoying when you try to use those highlights for prompts in another tool and the quotation marks aren’t regular ASCII quotes.
A super basic cleanup layer you can add is a Code by Zapier step right after the highlight data arrives. You don’t need to know JavaScript deeply — even copying a snippet like `output = inputData.text.replace(/\u2019/g, “‘”);` will turn curly apostrophes into the straight kind, which a lot of text processors expect. Another handy one is trimming trailing spaces and removing double line breaks with `.trim().replace(/\n{2,}/g, “\n”)`.
I swear half my weird automation bugs vanish when I normalize quotation marks. It sounds obsessive, but I’ve had GPT completely ignore a sentence because the quote surrounding it was a Unicode “smart quote” from Readwise instead of the plain one. If you’ve never compared them side by side, they look identical until they break your regex later.
Tagging highlights automatically with context
Pulling your highlights into a table is fine, but what makes them useful is knowing *why* you saved them. Doing that manually defeats the point of automation, so I’ve messed around with adding a tagging layer before storage.
For an easy first version, you can check if the highlight’s source title or author contains certain words and use a Formatter step to add a matching category. For example, if the author string contains “Kahneman,” set the category as “psychology.” A lot of people overcomplicate this by trying to guess the topic based on every single word in the highlight itself. That’s fun to try, but your automation will start returning gibberish categories like “water bottle” because one sentence mentioned hydration.
If you *do* want to get fancier, feeding the highlight text into an AI classifier step can work — though be ready for occasional weirdness like every highlight from one book being tagged as ‘fiction’ because the author used a metaphor. I once got a list of tags where half were correct and one randomly said “guitar” (there was zero mention of music). 🙂
Sending highlights straight into writing prompts
One of my favorite setups takes Readwise highlights and, without me touching them, turns them into writing prompts stored in a Drafts app workspace. This way I can pull up my phone, pick a random one, and start writing without scrolling through a giant spreadsheet.
To do this, I send the cleaned highlight text into a short AI step that paraphrases it into a question. Example: the highlight “People don’t decide their futures, they decide their habits” becomes “What habit are you building right now without realizing it?” That gets saved with a prefix like “Prompt:” in my writing app.
For beginners, the key is to avoid making this dependent on you pressing a button. If you want the prompts to be there when you wake up, the Zap or automation has to run on a schedule (say, once every morning) and pull only recent highlights. Otherwise, you’ll have duplicates cluttering up your app. Filtering by the ‘highlighted_at’ timestamp works best here — as long as you remember it might be in UTC, which explains why your “today” filter sometimes grabs stuff from yesterday.
Keeping the automation from going stale
Even with everything working, the biggest killer of these setups is slow rot — one day an API endpoint changes, or Readwise adds a new required field, and suddenly your Zap errors out. I keep a dummy Zap that runs once a week just to hit the Readwise API and confirm it’s alive. If that one step fails, I know the rest will fail too, and I can fix it before it matters.
A simple maintenance trick is storing your API token in one central place — like a password manager — instead of hardcoding it into half a dozen different automations. That way, if Readwise ever resets the token, you only have to update it once.
Also, resist the urge to trust these totally. I still open Readwise once in a while and scroll through recent highlights just to make sure they made it to my other tools. I’ve caught enough silent failures this way to know it’s worth the minute it takes.
What to do when highlights vanish midstream
Here’s the one that drove me nuts: sometimes a highlight arrives in my automation run and is gone in the final output. No error, no skipped step, just not there. In my case, this turned out to be a problem with using the wrong mapping in Notion. The Zap set a field using `results.0.text` (the first highlight) instead of looping the results array. Once the API returned multiple highlights, only the first one survived.
If you ever see missing highlights, go to the task history in your automation tool and inspect the raw input data. If you can see the missing line there, it means your zap or script is just not telling the destination to make that record. Nine times out of ten, it’s bad loop handling or mismapped fields. The fix is usually just adding a looping step or changing the mapped field from a fixed index to the dynamic loop variable.
And yes, it’s one of those fixes that works instantly and makes you wonder why you didn’t just check the task history on day one instead of rebuilding the whole thing twice.