Free permalink structure builder
Permalink generator with the redirects you will need
A permalink is the address a post is supposed to keep for good, and this page assembles one out of the pieces a CMS offers — /%year%/%monthnum%/%day%/%postname%/ and its relatives — filled in from a real title, date, category, author and ID as you type. It is free, with no account and nothing to install. It tells you what each structure quietly commits you to, and if you paste the address a post already lives at, it writes the 301 rules for Apache, Nginx and Cloudflare that stop the old one turning into a 404.
- 100% free
- No signup
- WordPress, Jekyll and Hugo tags
- 301 rules written for you
- Warns what a structure costs
The permanent address of this post
https://example.com/yyyy/mm/dd/how-we-cut-our-shipping-times-in-half/
Structure /%year%/%monthnum%/%day%/%postname%/ · 50 characters of path
What this structure commits you to
- The date is baked into the address, which suits news and dates evergreen guides. Republishing a 2024 guide in 2026 leaves it living at a 2024 address unless you move it and redirect.
Changing an address that is already published
Structure tags you can use
| %year% | Four-digit year the post was published |
|---|---|
| %monthnum% | Month as 01 to 12 |
| %day% | Day of the month as 01 to 31 |
| %hour% %minute% %second% | Publication time, two digits each |
| %postname% | The slug made from the title |
| %post_id% | The database ID, unique and never reused |
| %category% | The slug of the main category |
| %author% | The author's nicename |
| :title :categories :section | Jekyll and Hugo spellings of postname, category and section |
How to build a permalink structure
Three steps, and the address at the top updates with every field you touch.
Describe the post once
Fill in the title, the site address, the publication date, the category and the author, and add the numeric ID if your structure uses one. The title is turned into a slug with the same rules a CMS applies — lowercase, hyphens, accents flattened — so what you see is what will be saved. Pasting anywhere on the page drops the first line of your clipboard into the title field.
Pick the structure, and read what it costs you
Nine presets cover the WordPress settings screen — Day and name, Month and name, Post name, Category and name, Numeric — plus a /blog/ prefix, an author path, and the defaults Ghost, Jekyll and Hugo ship with, or write your own with %year%, %monthnum%, %postname%, %post_id%, %category% and %author%. The panel underneath names what the choice commits you to: a date you cannot quietly remove later, a category that rewrites the address when a post moves, or a structure with nothing unique in it at all.
If the post is already live, take the redirects
Paste the address the post lives at today into the last field and the 301 rules appear, written three ways: a Redirect line for an Apache .htaccess, a location block for Nginx, and a source-target-status row for Cloudflare Bulk Redirects. Copy the one your host uses and put it in place before the new address goes live, not after.
Technical specifications
| Structure tags understood | %year% %monthnum% %day% %hour% %minute% %second% %postname% %post_id% %category% %author%, plus the Jekyll and Hugo spellings :year :month :day :title :slug :categories :section |
|---|---|
| Presets | Nine: the five WordPress settings-screen structures — one of which is also Ghost's default — a /blog/ prefix, an author path, the Jekyll default and Hugo's section-and-title, plus a free-text box for your own |
| How the slug inside is built | Lowercase, hyphen-separated, accents flattened and ampersands spelled out — the same rules the slug tool on this site applies — for the title, the category and the author alike |
| Path tidying | Doubled slashes collapsed, a leading slash guaranteed, the trailing slash added or removed on request, and an optional lowercase pass over the whole path |
| Warnings raised | Five checks: no per-post tag in the structure, a text tag in first position, a date baked in, a category that can change, and a path over 100 characters |
| Redirect output | Three forms of the same 301 — an Apache Redirect line, an Nginx location block with return 301, and a Cloudflare Bulk Redirects CSV row |
| What it does not do | It writes rules; it does not deploy them, test them or read your site. Nothing here talks to your server, and no address you type is looked up |
| Price | Free, no signup, and no limit on how many structures you try out |
Frequently asked questions
Will changing my permalink break existing links?
Yes, unless you redirect the old address, and it breaks more than you can see. The old URL starts returning 404: every link from another site, every bookmark, every share in a chat thread, every email newsletter already sent and every search result still listing the page all point at an address that no longer answers. WordPress softens exactly one case — when you rename a published post it keeps the previous slug in the _wp_old_slug field and quietly redirects requests for it — but that safety net does not cover a change to the structure itself, a move between categories, or any other CMS. A 301 that you write yourself covers all of them.
What is the difference between a slug and a permalink?
The slug is one piece of the address; the permalink is the whole of it. Change a slug and one post moves; change a permalink structure and every post on the site moves at once. The two decisions also live in different places: the slug is a per-post field you edit while writing, and the structure is a site-wide setting you ideally choose before the first post is published. The slug generator on this site handles the first, and this page handles what surrounds it.
Should the date be in the permalink?
Put it in for news and leave it out for everything else. A dated address helps a reader judge a report on last week's announcement, and it guarantees that two posts with the same title never collide. It works against you on evergreen material: a genuinely useful 2019 guide, revised every year since, still lives at a 2019 address that tells every reader in the search results the page is stale, and moving it out of that address in 2026 is a redirect job for every post you own. If you cannot decide, the neutral answer is the plain post name with a section prefix such as /guides/.
Should the redirect be a 301 or a 302?
A 301, because the move is permanent and that is what the code means. A 302 says the original address is still the real one and should keep its place in the index, which is right for a temporary campaign page and wrong for a renamed post. The catch worth knowing before you deploy one is that browsers cache a 301 hard — often until the cache is cleared by hand — so a 301 pointing somewhere wrong is much harder to take back than a 302, and it is worth testing the rule on one URL before applying it to a thousand.
Does the permalink structure affect how fast the site is?
Slightly, in WordPress, and only for structures that open with a text tag. When the pattern begins with %postname%, %category% or %author%, WordPress cannot tell from the shape of an incoming request whether it is looking at a post or at a page, so it switches on what the code calls verbose page rules and compares the request against every page slug on the site before deciding. On a site with a handful of pages this is unmeasurable; on one with thousands it is real, and it also means a page named contact will win any collision with a post of the same slug. Putting anything fixed in front — /blog/, /guides/, a year — avoids the whole mechanism.
What happens if I change the whole structure at once?
Every URL on the site changes in the same moment, so you need a rule rather than a list. Write a pattern-based redirect that maps the old shape to the new one, deploy it at the same time as the change, and then keep it: removing it a year later re-breaks everything it was protecting. Two details matter for recovery. Point each old address at the specific page that replaced it, never at the homepage, because a mass redirect to the front page is treated as a soft 404 and the pages simply drop out. And keep chains to a single hop — Google's crawler follows up to ten redirects before giving up, but each extra hop costs time and clarity, and chains have a habit of growing during the next redesign.
Can two posts end up with the same permalink?
Not for long — the CMS will resolve it, usually by appending -2 to the second slug without telling you. That is why a structure needs at least one piece that varies per post: %postname% or %post_id%. A structure of /%year%/%monthnum%/ alone would give every post published in the same month the same address, and this page flags that before you commit to it. A dated structure keeps posts with identical titles apart automatically, which is one of the few genuine arguments in its favour.
What makes an address permanent, and what to do when it is not
“Cool URIs don't change” is the title of a note Tim Berners-Lee wrote for the W3C in 1998, and the argument in it has aged better than almost anything else from that year: an address is the one part of your page that other people copy, and you do not control any of the copies. The links, the bookmarks, the citation in a PDF, the message someone pinned in a group chat four years ago — all of them keep pointing at the string you chose, long after you have forgotten choosing it. He also anticipated the usual excuses, and the most common one is still the same: the address contains something that turned out not to be permanent. A department name. A technology. A year. The structure you pick above is a promise about which parts of your site will never change, so the useful question is not which pattern looks tidiest but which of these pieces you are prepared to be held to.
When the promise has to be broken anyway, the redirect is the whole of the repair, and the details decide whether it works. A 301 tells browsers and crawlers that the move is permanent, which is what carries the old address's accumulated standing across to the new one; a 302 says the old address is still the canonical one and keeps it in the index. Each old address should point at the specific page that replaced it — sending a batch of retired URLs to the homepage instead is read as a soft 404 and the pages fall out of the index rather than being consolidated. Keep the hop count at one: Google follows up to ten redirects in a chain, but every extra hop is another thing to get wrong in the next redesign, and chains grow silently. WordPress does provide one narrow safety net worth knowing about, because it fools people into thinking redirects are automatic: rename a published post and the old slug is stored in the _wp_old_slug field, and requests for it are 301'd to the new one. That covers a renamed post and nothing else — not a structure change, not a category move, not a migration to a different platform.
Choosing between the structures comes down to which kind of churn you expect. A dated path is honest for news, guarantees two same-titled posts never collide, and is close to impossible to unwind later. A category path reads beautifully and turns every future reorganisation of your categories into a redirect project. A numeric path built on %post_id% is the most stable thing you can have, since the ID never changes and never reveals a date, and the least useful to a human reading the link. A plain post name is what most sites settle on, ideally behind a fixed prefix like /blog/ or /guides/ so the CMS does not have to test every page slug against every request. Whichever you take, the slug on the end is where the reading happens, and the slug generator handles that end in bulk; if the titles feeding it came out of a word processor, running them through the text cleaner first stops a non-breaking space or a curly quote from travelling into your CMS with them.
Nothing here touches your site
This page writes text. It does not connect to your domain, fetch a page, test a redirect or check whether an address exists, and the details you type — a site not yet launched, a post still in draft, an internal staging address — are held in this tab and nowhere else. Every pattern is rendered by JavaScript already downloaded to your machine, so no field on this form is uploaded, logged or remembered for your next visit.