You delete every test item from a new SharePoint list, add the first real one, and it shows up as ID 6. Then someone asks you to make it start at 1 again, and you discover there’s no button for that anywhere.
The short answer is that SharePoint Online can’t reset a list’s ID column. It’s a read-only counter that never hands out a number twice. What you can do is start a fresh list whose IDs begin at 1, or add your own ticket number that you control and can restart whenever you like.
In this tutorial, we’ll prove why the sharepoint list reset id request can’t be done, then build both workarounds on a real list: a new list created from the existing one, and a Ticket No column numbered by a Power Automate flow. I’ll also cover the old ListReset database trick and why you shouldn’t touch it.
Here’s what we’re building:

Notice the two numbers side by side. The ID column still starts at 6 because of the deleted test items, while Ticket No and Ticket Code run from 1 (TKT-0001) to 3. That second number is the one your users should see.
Can You Reset the ID Column in a SharePoint List?
No. Every list has an internal counter for the next ID. Each new item takes the next number, and deleting items never moves the counter back. Clearing the list, emptying the SharePoint recycle bin or editing the column won’t change it either.
It’s built that way on purpose. Flows, Power Apps, lookups and links often store an item’s ID, so reusing a number would quietly point them at the wrong item. You can see the column’s settings for yourself with a REST GET request (I sent it with the header Accept: application/json;odata=nometadata to get clean JSON):
https://spguides.sharepoint.com/sites/SPGuides/_api/web/lists/getbytitle('SPGDemo Ticket Numbers')/fields/getbyinternalnameortitle('ID')?$select=Title,InternalName,TypeAsString,ReadOnlyField

{
"InternalName": "ID",
"ReadOnlyField": true,
"Title": "ID",
"TypeAsString": "Counter"
}
The response shows TypeAsString as Counter and ReadOnlyField as true. SharePoint fills the value; nobody, including site owners and admins, can write to it.
| Option | IDs start at 1? | Keeps old items? | Best for |
|---|---|---|---|
| New list from the existing list | Yes | No (copy them in) | Lists that are still in testing or can be rebuilt |
| Your own number column (Power Automate) | Your number does | Yes | Live lists, yearly or per-project numbering |
| Edit the content database (on-premises) | Unsupported | Risky | Never – see the ListReset section below |
Before You Start
You need Edit permissions on the site to create lists (site members have it), and a Power Automate license that includes the standard SharePoint connector, which comes with most Microsoft 365 plans. I’m building everything on https://spguides.sharepoint.com/sites/SPGuides with this list:
| Column | Type | Notes |
|---|---|---|
| Issue | Single line of text | The renamed Title column |
| Requester | Single line of text | Who opened the ticket |
| Category | Choice | Hardware, Software, Access, Network |
| Ticket No | Number | Filled by the flow: 1, 2, 3 … |
| Ticket Code | Single line of text | Filled by the flow: TKT-0001 … |
For sample data, I’ll add tickets from Megan Bowen, Alex Wilber and Adele Vance after the flow is on, so the flow numbers them.
Step 1: Create the List and Reproduce the Problem
First, we’ll recreate the situation behind most reset requests: a list that was tested with dummy items before go-live. You can create the list in the browser with + New > List > Blank list, or with PnP PowerShell like this:
Connect-PnPOnline -Url "https://spguides.sharepoint.com/sites/SPGuides" -ClientId "<your-app-id>" -Interactive
$name = "SPGDemo Ticket Numbers"
New-PnPList -Title $name -Template GenericList -OnQuickLaunch
Add-PnPField -List $name -DisplayName "Requester" -InternalName "Requester" -Type Text -AddToDefaultView
Add-PnPField -List $name -DisplayName "Category" -InternalName "Category" -Type Choice -Choices "Hardware","Software","Access","Network" -AddToDefaultView
Add-PnPField -List $name -DisplayName "Ticket No" -InternalName "TicketNo" -Type Number -AddToDefaultView
Add-PnPField -List $name -DisplayName "Ticket Code" -InternalName "TicketCode" -Type Text -AddToDefaultView
Next, add five pilot items and delete them again. This mirrors what a project team does while testing forms and views:
# five pilot items, then delete them (they go to the recycle bin)
1..5 | ForEach-Object { Add-PnPListItem -List $name -Values @{ Title = "Test ticket $_"; Requester = "Test User"; Category = "Hardware" } }
Get-PnPListItem -List $name | ForEach-Object { Remove-PnPListItem -List $name -Identity $_.Id -Recycle -Force }
The deleted items sit in the site recycle bin. If you have a bigger list to clear, see deleting all items from a SharePoint list with PnP PowerShell.

Checkpoint: The list is empty, but the next item you add gets ID 6, not 1. Restoring the test items or emptying the recycle bin won’t move the counter back.
Step 2: Know Why “Save List as Template” Isn’t the Answer
Older guides tell you to save the list as a template and create a new list from it. On modern SharePoint Online sites, that link isn’t there.
Custom script is blocked by default on modern team and communication sites, and with it blocked, Save list as template is removed from List Settings. I wrote up the details in why Save list as template is missing.

An admin can allow custom script on a site, but SharePoint switches it back to not allowed within 24 hours, so it’s not something to build a process on. Classic list templates (.stp files) also had size limits and were never meant for this job.
If your organization wants a reusable template for lists like this, a SharePoint Administrator can publish a custom list template from an existing list with PowerShell. It then shows up for everyone on the From your organization tab when they create a list. Like every template, it copies the structure, not the items or the counter.
Step 3: Restart IDs at 1 With a New List From the Existing List
A brand-new list always starts its counter at 1. SharePoint can copy the columns, views and formatting of your old list for you, so this takes about a minute:
- Go to the site home page and select + New > List.
- In the How would you like to start? dialog, under Import from, choose Existing list. Older guides and Microsoft’s support article still call it From existing list.
- Leave SPGuides (this site) selected on the left, pick SPGDemo Ticket Numbers on the right and select Next.
- Name the new list, for example SPGDemo Ticket Numbers 2026, leave Show in site navigation on, and select Create.


The next screen says it plainly: columns, views and formatting will copy over to the new list. Items don’t.

Add an item to the new list and look at its ID. I added one monitor ticket for Megan Bowen:

Checkpoint: The first item in the new list has ID 1, and the Issue, Requester, Category, Ticket No and Ticket Code columns came across with the same view.
A few limits from Microsoft’s support article: the copy doesn’t include any items, you can’t use a source list with more than 80 views, and only the first two automated rules come across. Re-add the rest by hand.
To move real items, copy list items to another list with Power Automate or add bulk data from Excel with PnP PowerShell. Keep in mind that copied items get new IDs (1, 2, 3 in copy order), so anything that stored the old IDs needs updating.
Finally, rename or retire the old list and point apps, flows and links at the new one. Every flow trigger references the list by its GUID, so a new list means re-selecting it in each flow. You can look one up with PowerShell to get a SharePoint list GUID.
Step 4: Add a Ticket Number Column Filled by Power Automate
For a list that’s already live, recreating it is too disruptive. The better fix is to stop showing the ID to people and give them a number you own. We’ll build a flow from the Power Automate tutorials toolbox that sets Ticket No to the highest existing number plus one.
- In Power Automate, select + Create > Automated cloud flow, name it, and pick the SharePoint trigger When an item is created.
- Set Site Address to the SPGuides site and List Name to SPGDemo Ticket Numbers.
- Open the trigger’s Settings, and under Concurrency control switch Limit to On and set Degree of parallelism to 1.

Concurrency of 1 matters. If two people submit tickets in the same minute, two runs could read the same last number and both write 5. With one run at a time, each run sees the number the previous run saved.
Up to 10 more runs wait in line (Maximum waiting runs). Microsoft notes that once you turn it on, you can only turn it off by deleting and re-adding the trigger.
Here are the trigger’s key settings in code form (the list GUID is swapped for the list name to keep it readable):
{
"type": "OpenApiConnection",
"inputs": {
"parameters": {
"dataset": "https://spguides.sharepoint.com/sites/SPGuides",
"table": "SPGDemo Ticket Numbers"
}
},
"splitOn": "@triggerOutputs()?['body/value']",
"runtimeConfiguration": {
"concurrency": {
"runs": 1
}
}
}
Next, add a SharePoint Get items action, rename it Get last ticket, and set the advanced parameters so it returns only the highest Ticket No. The filter skips items the flow hasn’t numbered yet. For more filter patterns, see the Power Automate OData filter query guide. This is the action’s Code view tab:
{
"type": "OpenApiConnection",
"inputs": {
"parameters": {
"dataset": "https://spguides.sharepoint.com/sites/SPGuides",
"table": "SPGDemo Ticket Numbers",
"$filter": "TicketNo gt 0",
"$orderby": "TicketNo desc",
"$top": 1
},
"host": {
"apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline",
"connection": "shared_sharepointonline",
"operationId": "GetItems"
}
},
"runAfter": {}
}

Then add a Compose action named Next number with this expression. If no ticket has a number yet, it returns 1; otherwise it adds 1 to the highest Ticket No:
if(empty(body('Get_last_ticket')?['value']), 1, add(int(first(body('Get_last_ticket')?['value'])?['TicketNo']), 1))
Last, add Update item. Use the trigger’s ID for Id, the trigger’s Issue (Title) for Title, the Compose output for Ticket No, and this expression for Ticket Code. It pads the number to four digits, the same trick as formatting numbers with leading zeros in Power Automate:
concat('TKT-', formatNumber(outputs('Next_number'), '0000'))
And the Update item action in Code view:
{
"type": "OpenApiConnection",
"inputs": {
"parameters": {
"dataset": "https://spguides.sharepoint.com/sites/SPGuides",
"table": "SPGDemo Ticket Numbers",
"id": "@triggerOutputs()?['body/ID']",
"item/Title": "@triggerOutputs()?['body/Title']",
"item/TicketNo": "@outputs('Next_number')",
"item/TicketCode": "@{concat('TKT-', formatNumber(outputs('Next_number'), '0000'))}"
},
"host": {
"apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline",
"connection": "shared_sharepointonline",
"operationId": "PatchItem"
}
},
"runAfter": {
"Next_number": [
"Succeeded"
]
}
}
Checkpoint: Save the flow. The designer shows four cards with no errors: When an item is created, Get last ticket, Next number and Update item.
Test the Flow
I added three tickets to SPGDemo Ticket Numbers: a laptop dock from Megan Bowen, a Power BI access request from Alex Wilber and a VPN issue from Adele Vance. The trigger polls the list, so all three runs started within a couple of minutes, and each finished in one to two seconds.

Open a run and select a card to see its values. In the last run, Next number returned 3 because Get last ticket found Ticket No 2 as the highest number:

Back in the list, the IDs are 6, 7 and 8 because of the deleted pilot items, and the tickets got Ticket No 2, 1 and 3. There are no gaps and no duplicates, but the numbers follow the order the runs happened, not the ID order.
If they must match creation order exactly, sort Get last ticket on Created and number items in a scheduled flow instead.
Because the flow updates the item, the item’s Modified date changes once after it’s created. That’s expected, and it doesn’t start the flow again because the trigger fires only on new items.
What About ListReset and the SharePoint Database?
If you searched for ListReset(ListId, you’ve probably seen old SharePoint 2010 and 2013 scripts. They change the next-ID value for a list straight in the content database with SQL, usually in the AllListsAux table. That only ever applied to on-premises farms; SharePoint Online gives you no database access at all.
On SharePoint Server, don’t do it. Microsoft lists “adding, changing, or deleting any data in any table” of SharePoint Server databases as unsupported, along with running ad hoc queries against them.
A farm with such a change stays unsupported until you restore or roll back the database. If the list still has items, a lowered counter can also hand out IDs that already exist.
Also check where you are: SharePoint Server 2013 is long out of support. On a supported farm, the same two workarounds above apply, using the classic list-from-template steps where your version has them. If you still manage old farm scripts, the PowerShell steps to get a site template are a safer way to copy structure.
Make It Production-Ready
- Never show the SharePoint ID on invoices, forms or emails as a business number. Use Ticket No or Ticket Code, and keep the ID for links and lookups.
- Index the Ticket No column (List settings > Indexed columns) before the list grows past 5,000 items, so the Get items filter and sort stay fast.
- Make the flow owner a service account or add a co-owner, so numbering doesn’t stop when someone leaves.
- To restart numbering each year, add a Year column and filter Get last ticket on it, for example
Year eq 2026 and TicketNo gt 0.
Troubleshooting
| Problem | Fix |
|---|---|
| Two tickets got the same number | Concurrency control isn’t on, or it’s set above 1. Set the trigger’s Degree of Parallelism to 1. |
| Get items fails with a column error | Use the internal name (TicketNo), not the display name with a space. |
| Every ticket gets number 1 | The filter or order by uses the wrong column, so Get items returns nothing. Check the Get last ticket output in the run. |
| I can’t pick my list in Existing list | The source list has more than 80 views. Delete unused views first. |
| Ticket numbers aren’t in ID order | Runs from one trigger poll can execute in any order. Numbers stay unique; use a scheduled flow sorted on Created if order matters. |
| Trigger concurrency throttling detected banner | The flow details page showed this after my test burst. New runs waited in line because of the limit of 1, which is the trade-off for unique numbers. |
| Flow stopped after I recreated the list | Triggers point at the old list’s GUID. Re-select the new list in the trigger and every action. |
Where to Take It Next
If you’d rather compute a display number without a flow, a SharePoint calculated column can format the ID with a prefix, though it can’t restart at 1. You can also add a SharePoint list view that hides the ID column so people only see Ticket No.
And if the whole list needs a new name after a rebuild, here’s how to rename a SharePoint list using Power Automate. For more list projects, browse the SharePoint tutorials.
These SharePoint list posts pair well with this one:
Frequently Asked Questions
Can I reset the ID column in SharePoint Online?
No. The ID is a read-only counter that SharePoint fills, and it never reuses numbers, even after you delete every item or empty the recycle bin. To start at 1 again, create a new list with + New > List > Existing list.
How do I reset a SharePoint list ID to 1?
Create a new list from the existing one. Its counter starts at 1, and it copies the columns, views and formatting but not the items, as Microsoft’s From existing list support article explains. Then copy your items in and retire the old list.
Does deleting all items reset the SharePoint list ID?
No. In my test, five deleted pilot items still used IDs 1 to 5, and the next item got ID 6. The counter never moves back, even after the recycle bin is emptied.
Is it safe to run ListReset or change the next ID in the content database?
No. On SharePoint Server, Microsoft treats any change to data in its database tables, and even ad hoc queries, as unsupported until you restore the database. SharePoint Online has no database access at all.
How do I get numbering that restarts every year?
Add your own Number column and fill it with a Power Automate flow that finds the highest number for the current year and adds one. Add a Year column, filter on it, and keep concurrency control at 1.

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.