Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

How to Reset the ID in a SharePoint List (and 3 Workarounds That Work)

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:

SPGDemo Ticket Numbers list where IDs start at 6 but the Ticket No column set by Power Automate starts at 1

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
REST response for the SharePoint list ID field showing TypeAsString Counter and ReadOnlyField true
{
  "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.

OptionIDs start at 1?Keeps old items?Best for
New list from the existing listYesNo (copy them in)Lists that are still in testing or can be rebuilt
Your own number column (Power Automate)Your number doesYesLive lists, yearly or per-project numbering
Edit the content database (on-premises)UnsupportedRiskyNever – 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:

ColumnTypeNotes
IssueSingle line of textThe renamed Title column
RequesterSingle line of textWho opened the ticket
CategoryChoiceHardware, Software, Access, Network
Ticket NoNumberFilled by the flow: 1, 2, 3 …
Ticket CodeSingle line of textFilled 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.

SharePoint recycle bin showing five deleted Test ticket items from the SPGDemo Ticket Numbers list

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.

SharePoint List Settings Permissions and Management section without the Save list as template link

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:

  1. Go to the site home page and select + New > List.
  2. 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.
  3. Leave SPGuides (this site) selected on the left, pick SPGDemo Ticket Numbers on the right and select Next.
  4. Name the new list, for example SPGDemo Ticket Numbers 2026, leave Show in site navigation on, and select Create.
SharePoint site home New menu open with the List option highlighted
How would you like to start dialog with Existing list highlighted under Import from

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

Select an existing list dialog with SPGuides (this site) and the SPGDemo Ticket Numbers list selected

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

New SPGDemo Ticket Numbers 2026 list where the first item has ID 1

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.

  1. In Power Automate, select + Create > Automated cloud flow, name it, and pick the SharePoint trigger When an item is created.
  2. Set Site Address to the SPGuides site and List Name to SPGDemo Ticket Numbers.
  3. Open the trigger’s Settings, and under Concurrency control switch Limit to On and set Degree of parallelism to 1.
When an item is created trigger Settings tab with Concurrency control Limit on and Degree of parallelism set 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": {}
}
Code view of the Get last ticket action showing filter TicketNo gt 0, orderby TicketNo desc and top 1

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.

28-day run history of the ticket number flow with three Succeeded runs

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:

Flow run with the Next number card selected and its output showing 3

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

ProblemFix
Two tickets got the same numberConcurrency 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 errorUse the internal name (TicketNo), not the display name with a space.
Every ticket gets number 1The 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 listThe source list has more than 80 views. Delete unused views first.
Ticket numbers aren’t in ID orderRuns 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 bannerThe 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 listTriggers 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.