Comment cards connect through a source ledger to a tagged coding document.
Check the source and import before coding.

A top-level comment is a comment on the post. A reply is a response to a comment. These steps use top-level comments only.

A source id is the public name for one post, comment, or author. NVivo is software that stores text for hand coding. Qualitative coding means you mark text with a named label and write the reason.

An Actor is a hosted program that collects data. A Task is a saved input preset for an Actor. The TikTok Comments Scraper Actor collects public source rows. You do the coding. The Actor does not create codes, cases, or an NVivo file.

The public Task Export TikTok Comments to CSV or Excel was checked on 13 October 2026. A public Task is only a starting input. It does not mean the analysis happens by itself.

Collect the right public rows

Use public build 0.1.17. The input `startUrls` accepts 1 to 100 items. Each item must be a full known URL that contains `/video/` or `/photo/`, or a numeric post id. A short link is not enough. Open the short link and copy the full known URL first.

The saved Task contains one sample video. Replace that sample with one known public post you intend to study. The saved input is:

json
{
  "startUrls": ["https://www.tiktok.com/@zachking/video/7631200623693729038"],
  "maxCommentsPerVideo": 250,
  "includeReplies": false,
  "maxRepliesPerComment": 10
}
Collect the right public rows

`maxCommentsPerVideo` is the top-level row limit for one post. Allowed values are 1 to 1,000. The saved Task uses 250. For the first test, change 250 to 3.

`includeReplies` false means reply rows are not collected. Keep it false for this test. `maxRepliesPerComment` is the reply limit under one saved parent comment. Allowed values are 1 to 100. The saved Task uses 10. That reply limit collects nothing while `includeReplies` is false.

A current control used a top-level limit of 3. It saved 3 unique comments. Each comment matched the requested post. Each had nonempty text, an `authorId`, and `createdAt`. On each row, `isReply` was false, `replyDepth` was 0, and `status` was ok. The value ok means a real comment was saved. `replyDepth` 0 means the row is top-level.

That control supports only a top-level collection. It did not test reply collection. It did not collect every public comment. A row limit, or a public feed sample, is not the full comment set.

Read the row and the OUTPUT summary

Keep the untouched source JSON or JSONL file. JSON is the structured file from the Actor. Also keep OUTPUT. OUTPUT is the collection summary, not a comment row.

Keep these OUTPUT names:

  • `inputsReceived`
  • `uniquePostsPlanned`
  • `postsAttempted`
  • `postsWithRows`
  • `commentsWritten`
  • `repliesWritten`
  • `rowsWritten`
  • `stopReasonCounts`
  • `failedInputDetails`

Also keep the stop, status, and limit detail for each input. This lesson does not invent those OUTPUT numbers for the control. The known saved comment count is 3. Read the named OUTPUT values on your own file. Do not fill an unknown count with 0.

`repliesWritten` needs a careful reading. A saved value of 0 means no reply rows were written. It does not mean people wrote no replies. Replies were left out of scope. Missing reply text is not zero evidence of conversation.

Every actual saved comment has `status` ok. An unavailable input stays in OUTPUT. Do not create a fake empty comment row for it.

A public value can be null. Null means the value was not supplied. The value false is different. False means the source said no. Do not treat false as unknown.

`commentIndex` is the saved position of a row. It is not a relevance score from TikTok. `replyCount` is a count of replies. That count does not supply reply text.

The Actor can return these source columns:

  • `inputIndex`
  • `inputUrl`
  • `postUrl`
  • `postId`
  • `commentId`
  • `text`
  • `language`
  • `createdAt`
  • `likesCount`
  • `parentCommentId`
  • `replyToCommentId`
  • `isReply`
  • `replyDepth`
  • `replyCount`
  • `authorId`
  • `authorHandle`
  • `authorDisplayName`
  • `authorUrl`
  • `authorVerified`
  • `isPinned`
  • `isHeartedByCreator`
  • `commentIndex`
  • `replyIndex`
  • `status`
  • `scrapedAt`

You create three more columns. They are not source columns.

  • `local_record_key` is the id you will give NVivo.
  • `author_key` is the author id copied as text, so rows can be grouped.
  • `collection_time` is the time you record on the working file.

If `collection_time` is a copy of `scrapedAt`, write that down. `selection_note` is also your note. It is not a source column. A made-up `local_record_key` is not a verified comment id. Store every id as text. A spreadsheet can change a long number when a column is numeric.

The Actor supplies public text only. It does not supply qualitative codes, an NVivo import, cases, a medical reading, or an automatic theory.

Do these eight actions

  1. Write the study rules first.

Name the known public posts before you collect. Write the start date and the end date for comments you will keep. Write the language rule. Choose top-level comments for this method. A reply study needs its own test and an explicit later choice. If `createdAt` is outside your dates, keep that row out of coding and say why in `selection_note`. The garden sentences later in this lesson are ordinary gardening fiction. A public comment sample cannot support a medical claim.

  1. Test one intended post with a limit of 3.

Use one real post you already know. Set `maxCommentsPerVideo` to 3. Set `includeReplies` to false. Then inspect the source ids, the text, `status`, and OUTPUT. A limit of 3 is large enough to see the real columns. It is small enough to check before a large file. The checked control supports this top-level path only. Keep unsaved replies as excluded scope.

  1. Preserve the source, then make a flat working table.

Leave the source JSON or JSONL file unchanged. Leave OUTPUT unchanged. The working table is a later copy. Use these columns: `local_record_key`, `postId`, `postUrl`, `commentId`, `author_key`, `text`, `createdAt`, `language`, `isReply`, `parentCommentId`, `collection_time`, and `selection_note`. Keep ids as text. Use the source `commentId` as `local_record_key` when it is present. If the source id is missing, create `local_record_key` and mark the gap in `selection_note`. That local key only holds your row. It is not proof of a TikTok comment id. The untouched source file lets you check this copy.

  1. Choose the case before you import.

A case is one unit you will code. In this method, one case is one comment observation. It is not one person. Use `local_record_key` as the unique case id. Keep `author_key` and `postId` as grouping columns. You can then read one account's comments together. You still must not call that account a confirmed person. This choice controls the count. Two comments from one `author_key` are two cases and one account group. They are not two people.

  1. Prepare one worksheet with stable columns.

Use one header row. Keep one kind of value in each column. Copy source `text` into `raw_text` with no changes. Put any edited copy in `analysis_text`. If you hide a private word or fix only your copy, write each change in a change log. If you change nothing, write "none" in that log. Save a quoted UTF-8 CSV file or an Excel file. UTF-8 is a text encoding that keeps letters such as é. A quoted field can hold a comma, a quotation mark, or a line break. Test one row that has all of those, plus a letter that is not plain ASCII. In Excel, import id columns as text. Do not remove meaningful symbols from raw comments so a file will open. A Word document is optional. You do not need it when the worksheet fits the study.

  1. Import the worksheet in NVivo 15 for Windows.

NVivo 15 Windows help calls this import a survey. The path is Import, then Survey, then Excel or Text File. The help page is Datasets. Select the file. Confirm the header row, the encoding, and the column separator. A separator is the character that splits columns, often a comma. Check the preview. Choose `local_record_key` as the unique record id. Mark `analysis_text` as open-ended text, which is text you can code. Mark `postId`, `commentId`, `author_key`, `isReply`, and the time columns as closed-ended. Closed-ended means the column only classifies the row. Leave a column out of NVivo if the worksheet already stores it. NVivo may label a row as a respondent. In this study, that label still means one comment. Check the menus on your installed copy. These names belong to the documented NVivo 15 Windows help. Do not force them onto every version or onto macOS. The comment case, the code rules, and the audit are study choices. They are not rules taken from that vendor page.

  1. Check the import, and reimport if the map is wrong.

Count the imported records. The count must match the worksheet you meant to import. Open a few records. Match the source id and the text exactly. Current NVivo 15 Windows help says you cannot edit survey source content after import. You also cannot change a column's analysis type or data type after import. If the map is wrong, correct the worksheet. Import that corrected file as a new checked copy. No actual NVivo application test was performed. These steps are a documented reader check. They are not a measured importer result.

  1. Code a small set by hand before the larger set.

Write each code label. Write what the code includes and what it excludes. Keep a memo and a coding version. When you read a short excerpt, keep its source and its case in view. One automatic case per comment is not one independent participant. Export the code-to-record map. Check it against the worksheet. Only then code the larger set.

People ask how comment rows can enter NVivo. One public question is this r/CompSocial comment. That question shows a need. It does not show that this case map fits every study.

Check a fictional three-row map

The rows below are original fiction. They are a teaching example, not an Actor result. No real comment words were kept from the control. Do not read these garden sentences as collected TikTok text.

The fiction uses two posts about an ordinary garden tray. Post P1 has two top-level comments. Post P2 has one top-level comment. Account key A wrote comment C1 on P1. The text is "The tray is hard to carry". Account key A also wrote comment C2 on P1. The text is "I added a handle". Account key B wrote comment C3 on P2. The text is "The instructions helped." All three rows are top-level and linked to a known post. The change log for R1, R2, and R3 says none. `analysis_text` matches those source words.

R1, R2, and R3 are three comment cases. A and B are two account keys. The keys are grouping facts. They are not three people.

The source, case, and column map

Check a fictional three-row map
local_record_keycasepostId (closed)commentId (closed)author_key (closed)isReply (closed)analysis_text (open)
R1one commentP1C1AfalseThe tray is hard to carry
R2one commentP1C2AfalseI added a handle
R3one commentP2C3BfalseThe instructions helped.

Use `local_record_key` as the NVivo case id. `analysis_text` is the only open-ended column in this map. `postId`, `commentId`, `author_key`, and `isReply` are closed-ended. R1 and R2 share account key A. They remain two cases because the unit is the comment. The shared key lets you read them together.

The coding result for those three cases

Use two codes. `handling_problem` means the writer says the object is hard to hold or move. `workaround` means the writer says what they changed to make the task easier. A comment that only says the instructions helped gets neither code.

Check a fictional three-row map
local_record_keyauthor_keycodereason
R1Ahandling_problemThe tray is hard to carry.
R2AworkaroundThe writer added a handle.
R3BnoneHelpful instructions fit neither code.

The counts are exact. There are 3 research comments. There are 2 coded comment cases, R1 and R2. Each coded case has 1 code. R3 has no code. Account key A has 2 linked comments. Those linked comments are not 2 independent people. The next row is not part of these counts.

A separate file-test row

R-TEST is a fourth made-up row. It tests commas, quotation marks, a line break, and the letter é. It is not a research comment. Keep it outside the 3 research comments. Keep it outside the 2 coded cases. Do not give it a code.

The expected raw text has two lines:

text
The note says "café, tray"
Carry it flat.
Check a fictional three-row map

This CSV puts that text in one quoted column. The comma stays inside the quotes. The inner quotation marks are doubled. The line break is a real line break, not the two characters slash and n.

csv
local_record_key,postId,commentId,author_key,isReply,analysis_text,selection_note
R-TEST,P-TEST,C-TEST,T,false,"The note says ""café, tray""
Carry it flat.",import test only
Check a fictional three-row map

After you open the preview, the text must match the two lines above. The comma must remain. The quotation marks around café, tray must remain. The line break must remain. The é must remain. `isReply` false on this test row is known false. It is not an unknown value. No importer was run for this file. There is no measured import result for R-TEST, R1, R2, or R3.

Sources & further reading

By Chronometrica · Updated

Back to top ↑