SEO Agency Project Management: Recurring Work on Cycles
By Sebastiaan Jansen · · 15 min read
The job of seo agency project management software is to run retainers as repeating cycles, with a capacity cap and a reviewed rollover. Without that, the same pages get re-planned from scratch every month. A board of one-off tasks hides how much work is already promised. Each cycle, you need to know which tickets fit, which wait, and which unfinished items are still worth doing. Rankings, content, and technical fixes all draw on the same hours. If the tool hides that limit, the overrun shows up in week three, when a new landing page arrives on a full calendar.
What seo agency project management software has to track
SEO work is repetitive and interrupt-driven at the same time. Every month has a report, a set of pages in progress, and a handful of new ideas from a call. Good seo project management falls apart when those three streams live in different places: a content calendar, a Slack thread, and a spreadsheet of technical leftovers.
Track five things in one place:
- The cycle, with a start, an end, and a capacity in hours you trust.
- Ticket types that match the work: content, technical, digital PR, reporting, and ad-hoc client requests.
- A triage stage, so a request doesn't get scheduled just because someone typed it.
- Rollover that a person accepts or drops, with a note the client can hear.
- The client record, so the latest call sits next to the open tickets.
Generic task tools can hold all of this if you're strict, and most of the value comes from being strict. Agency project management software fails the same way across SEO, ads, and build retainers: backlogs that never end, no cap, and status updates written from memory.
A sixth field is easy to skip and expensive later: who owns the next action. "In progress" doesn't tell you that. If the page is with the client, the next action is theirs, and your remaining hours start after they reply. If the page is with the editor, the next action is internal, and those hours still sit inside this cycle. Once the owner is written down, a ticket can't look active while nobody is moving it.
Why one-off boards fail a retainer
A retainer sells a pace. "Eight pages and a technical sweep" only works if both are sized before the month starts. On a board with no cycle, urgent tickets jump the queue forever. The monthly report still goes out because everyone can see it, and the technical sweep slowly dies.
Recurring tasks in Asana, ClickUp, Monday.com, or Jira copy a template forward. That's fine for the report ticket and the ranking check, and a poor fit for unfinished work. Copying last month's open tickets into this month doubles the list without asking whether the page, the keyword, or the client's priority has changed. Then people either close duplicates or do the work twice.
A cycle is a timebox. The Scrum Guide defines a sprint as a fixed length of time for a selected slice of work. An SEO team can take the timebox and leave the standups and story points. A calendar month works when invoices and reports already use that boundary. A two-week cycle suits a small retainer with weekly requests. Keep one length for a quarter so the comparisons mean something.
Most boards fail the same way: they look busy and have no "not this month" state. Every card has a date because the tool asked for one, so dates end up meaning three things at once: a client promise, a personal reminder, and a guess. Once those are mixed, you can't tell a late page from a page that was never selected. Give unselected work a backlog state with no date, and let a date mean the ticket is inside the current cycle.
Set the cycle before you fill it
Name the capacity in hours you can defend
Capacity is the hours for that client in that cycle, counted after the work every cycle must include. If three people touch the account, write down the sum. Reserve reporting first, then split the rest between production (pages, links, fixes) and a buffer for requests that survive triage.
Illustrative numbers, not a benchmark: a 40-hour month might hold 6 hours for the report and the call, 24 for production, and 10 left unassigned until triage. Without the buffer, every new request turns into scope creep or a broken promise.
Count only hours that can land on this client's tickets. Someone who is also on a site launch does not have a full week for the retainer. Subtract internal meetings, leave, and the other account before you write the number down. A capacity copied from the invoice ("they pay for 40, so we plan 40") ignores the report you already promised. Plan what's left after it.
Put the number on the cycle itself, where the people selecting tickets can see it, rather than in a side spreadsheet. If it lives somewhere else, the board fills until it looks full, and that happens well after the cap.
Pull a batch, then stop
At the start of the cycle, select tickets until the hours run out. Everything else stays in the backlog with a type and a client, unscheduled. "We'll try" is how a 40-hour month becomes 60. The backlog can be as long as it likes; the cycle stays a fixed size.
This selection order holds up on a client call:
- Committed recurring work: the report, monitoring, and pages already approved.
- Unfinished tickets you explicitly roll over.
- New tickets that won triage, in the order you agreed with the client.
- Stop. The rest goes to the next cycle or becomes a paid change.
Do the selection in one sitting, with the estimates visible. If the board "looks light" on Thursday and you add a ticket, the light tickets are usually waiting on the client; you don't actually have spare hours. If a selected ticket is blocked on day two, take the replacement from the top of the unselected list, and drop something else if the hours no longer fit. Don't just append.
Review rollover on the first day, not the last
Someone has to decide on rollover. On day one, open whatever was in progress and ask three questions. Is the outcome still what the client wants? Is the remaining work smaller than starting over? Has a newer ticket overtaken it in priority?
If the answers are yes, yes, and no, keep the ticket. Otherwise drop it or send it back to triage, and write one line the client can hear. Copying tickets forward without looking fills the board with old keywords. A page sitting in client review is still a promise, so those hours aren't free.
A useful note states the decision. "Carried: draft is with you, four hours left after your edits." "Dropped: you paused the directory list, so citations are back in the backlog." "Split: the outline is done, the draft is a new ticket for next cycle because this one was too big." The third case comes up a lot. A ticket that started as "write the page" and now contains research, an outline, a draft, and a design request will roll forever. Close out the piece that's actually done, and make the rest a new ticket that has to earn its place.
A worked example: one local SEO retainer
This is an illustrative month for a fictional client, Harbor Dental, on a 32-hour retainer. It isn't a case study.
On 1 March, committed work comes to 14 hours: the report (5), the call and notes (3), and two service pages left mid-draft from February (6). That leaves sixteen hours. The backlog holds a canonical fix (4 hours left), citation cleanup (8), four location pages (6 each), and an unestimated note from the call: "can we rank for emergency dentist."
Rollover keeps the canonical fix, since little is left and the pages still matter. Citation cleanup goes back to the backlog because the client paused that directory list. Scheduling it just because it was "in progress" would spend the buffer on a paused task.
The new keyword maps to a real service, so one location page gets a 6-hour estimate and goes into the cycle. The other three stay unscheduled. That's 14 + 4 + 6 = 24 hours, with 8 held as buffer.
On 18 March the client wants a response to a competitor's page. A tighter update to the page already in the cycle takes 5 hours and fits the buffer, so you don't open a second page. You name which backlog page won't start, so everyone sees the trade before the work begins.
The month-end note lists what shipped and what didn't: the two February pages, the canonical fix, one new page with the competitor update, and the citations, left out because the client paused them. If that mid-month request had needed 14 hours, it would have meant a swap or hours billed outside the retainer.
Two ordinary mistakes would have wrecked this month. The first is estimating the four location pages as "a batch" and pulling all four because 6 hours "feels" like it might stretch. At 6 hours each they come to 24 hours, the entire remainder plus the buffer. The second is treating the emergency-dentist note as approved because the client sounded keen on the call. Until someone maps it to a URL and puts a number on it, it's only a request. Mapping it turned a vague yes into one page, with three siblings still waiting.
Ticket types that match SEO work
With types, a cycle review takes minutes. Content needs a review stage. Technical work needs a "checked on the live site" step. A request needs triage before it gets any date.
| Type | Typical work | Stage that matters | Cycle behavior |
|---|---|---|---|
| Reporting | Rank note, call, recap | Sent | Recurs every cycle, sized first |
| Content | New or rewritten URL | Editor or client review | One URL per ticket; rolls only if a real draft exists |
| Technical | Indexation, speed, internal links | Verified on the live site | Rolls when the remaining check is short |
| Authority | Digital PR, citations | Logged outcome | Re-triage if the angle died |
| Request | Ideas from calls and chat | Triage | No cycle date until triage passes |
Use one ticket per URL. Nobody can estimate or roll over a ticket called "March SEO." If a fix touches many URLs, still name one outcome, such as "canonicals consistent on the money pages." Content in client review still takes capacity. Reporting keeps a fixed hour budget so writing the report doesn't turn into a hunt for what shipped.
Estimate the ticket before it can enter the cycle
An unestimated ticket can't be selected. The estimate is a planning number for this cycle, not a promise to the minute. Break the work into the steps you will actually do, then add them up.
For a content ticket those steps are usually: confirm the URL and the query, outline, draft, edit, and publish checks (title, internal links, indexation). If the client must approve the outline, put a wait between outline and draft, and don't count their waiting time as your hours. Do count the hours to apply their edits.
For a technical ticket, name the check that proves it's done. Nobody can check "Improve speed." "Largest template images compressed on the ten money pages, rechecked in the field data you already watch" can be sized. If you can't name the check, the ticket goes back to triage as a request for a decision rather than as production work.
A rough band is enough when the band still fits. "Four to six hours" can enter a cycle with eight hours free. It can't enter a cycle with five, because the top of the band breaks the cap. Use the high end for selection. People remember the low end on the call and the high end on the Friday the work lands.
Where the tickets should come from
Requests arrive as Slack messages, call notes, and errors on pages you shipped. If they stay in the tool they arrived in, the cycle plan is fiction. Make a ticket the same day, with a client and a type and no promise attached. Capture it right away and triage it later.
A 45-minute call can produce a new service, a page to kill, and a complaint about the report. File the notes, then split them while the wording is still the client's. Turning client meeting notes into tickets the same day keeps the roadmap in line with the call. "Quick one, add an FAQ block" is a request ticket even if it takes 20 minutes, because small jobs are what eat the buffer. Triage then decides between today's buffer and the next cycle.
Same-day capture is a short sequence, and skipping a step is how side channels come back:
- One ticket per distinct outcome, titled in the client's words first.
- Type set to Request until someone has sized it.
- Link the call or the message, so the next person doesn't re-ask the question.
- No date, no assignee, unless it's a production error on a page already in this cycle. That one can go to the person who shipped it, still inside the buffer, still counted.
Triage is a decision. It shouldn't turn into a grooming meeting that rewrites the backlog. For each request, pick one of four outcomes: do it inside the remaining buffer and name what it displaces; schedule it as a candidate for the next cycle; decline it, with a reason the client can hear; or turn it into a paid change because it doesn't fit the retainer. "Leave it in triage" isn't a fifth option. A request that survives two cycles without one of those four answers will come up again on a call, louder, and get treated as a promise you never made.
Ad agency project management has the same pressure: an urgent change against a plan that's already sold. In SEO the change is usually a keyword or a page. Triage it, swap something inside the cycle, and send the client one sentence.
Falrow for agencies is one place that capture can live. Messages, calls, and production errors become tickets under the same cycle rules, and meeting notes become reviewed tickets instead of a doc nobody opens. A disciplined ClickUp or Jira setup can do the same job. Whatever tool you use, the request nobody captured is what breaks the plan.
What to show the client
Clients ask what shipped and what's next. A portal of raw tickets often answers neither, because it's full of triage junk and internal subtasks. For many retainers a cycle update is enough: shipped, in progress, deferred, and the one decision you need from them. Whether you need a client portal or just better updates depends on who will log in. If the client has one owner, they'll read an update and skip the login.
Write the update from the cycle, not from memory. Four short blocks are enough:
- Shipped: the URL or the fix, and the date it went live.
- In progress: what you're waiting on, and whether the wait is yours or theirs.
- Not in this cycle: the items you explicitly deferred, each with a reason.
- One decision: a single question, with the two options and what each does to the next cycle.
The Harbor Dental note from the example fits that shape. Shipped: two service pages, the canonical fix, one location page. In progress: nothing, if the competitor update already went out with that page. Deferred: citation cleanup, because the client paused the directory list, and three location pages, because the hours went to the competitor response. Decision: none this month, or, if the next keyword is still open, "which of the three location pages is first in April?"
A list of rankings doesn't replace those blocks. Rankings explain why a page mattered; they don't say whether the page was in the plan. If you attach a rank note, put it under the shipped item it belongs to, so the report can't grow into a second project.
Inside the team, watch the cycle. Rankings still matter, but they won't tell you whether the month was planned well. These three checks will:
- Hours planned versus finished. Planning 30 and finishing 18 means the cycle was overfilled.
- Tickets that roll more than once. A second rollover usually points to a client block or a cluster of pages stuffed into one ticket.
- Age of triage. If a request goes a full cycle without a yes or no, it comes back as a surprise on the next call.
Cycle time, from start to done for one ticket type, shows whether a page is a one-cycle promise or a six-week one. Once you have a few months of finished tickets, use a percentile so one stalled migration doesn't define the typical page. A roadmap should count tickets by outcome. If it ignores the cycle, the paused citations stay listed long after the update said they'd stopped.
Read the three checks in the first week of the next cycle, while you can still change the selection. A review saved for the quarterly business review arrives after three overfilled months. If planned hours keep beating finished hours, suspect the estimates before the people. Cut the next cycle's production batch before you add a new ticket type.
How this sits next to the rest of the agency
A launch date on the same account belongs on its own plan. Project management for marketing agencies fits fixed dates, which make a weak template for monthly work. If one writer works on both plans, subtract their hours once. Two boards that each assume a full week are both wrong. Write down capacity, rollover, types, and triage before you change tools, or the new tool inherits the old "everything is due today" habit.
You don't need a separate seo agency project management software product if your current tool can hold a cycle capacity, ticket types, triage, and a rollover that a person reviews. The thing to change is running the retainer as a list that never ends. Teams on Asana or Jira should tighten those habits before considering a migration. A tool that can't leave a ticket unscheduled will keep overrunning the month.
When you do look at a tool, test it with last month's real tickets instead of a demo project. Import one retainer: the report, two half-finished pages, a paused citation list, and three requests that have no estimate. Then check four behaviors. Can a ticket sit with no date? Can you cap the cycle in hours and see the sum of what you selected? Can rollover be a choice rather than a duplicated list? Can you write the client update from shipped, waiting, and deferred without exporting every subtask? If any answer is no, the tool will recreate the one-off board with different labels.
Keep the retainer cycle and the fixed-date plan visibly separate even when they share a person. A homepage launch with a contract date doesn't go in the buffer. Either the retainer batch shrinks by that person's hours for that cycle, or someone else staffs the launch. Write the subtraction on the cycle before the month starts, next to the capacity number. If you only find out on the day the homepage is due, the SEO pages were never really selected, just hoped for.
FAQ
What should SEO agency project management software include for a retainer?
Cycles with a capacity, ticket types for content, technical work, reporting, and requests, and triage before anything is promised. Rollover should be a review rather than an automatic copy. The latest call needs to sit beside those tickets.
How is this different from a content calendar?
A content calendar lists publish dates. It doesn't show that a technical fix and the report share the same hours, and it can't triage a request that arrives later. Treat the calendar as a view of the content tickets inside the cycle, with one shared backlog so a "quick" page can't skip the cap.
Should unfinished SEO tasks roll into next month automatically?
No. Automatic rollover hides stalled work and doubles the plan. On day one, keep a ticket only if the outcome still matters and finishing it is less work than starting over. Drop or re-triage the rest, and say so in the client update. The monthly report should be a fresh ticket, not a copy of last month's notes.
Do SEO agencies need a client portal to manage retainers?
Only if several people on the client side will use it. A mirror of every internal ticket adds noise, plus mid-cycle additions that skipped triage. For many retainers, a short update covering what shipped, what rolled over, and what needs a decision is enough. Add a portal when stakeholders ask for status between updates and you can filter the board.