<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Educational Technology | Dr Riasat Islam</title><link>https://riasatislam.com/tags/educational-technology/</link><atom:link href="https://riasatislam.com/tags/educational-technology/index.xml" rel="self" type="application/rss+xml"/><description>Educational Technology</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 14 Jul 2026 12:00:00 +0100</lastBuildDate><image><url>https://riasatislam.com/media/icon_hu_8ad12554e234016b.png</url><title>Educational Technology</title><link>https://riasatislam.com/tags/educational-technology/</link></image><item><title>How to Bulk Publish Activities to Padlet from a Spreadsheet</title><link>https://riasatislam.com/blog/how-to-bulk-publish-activities-to-padlet/</link><pubDate>Tue, 14 Jul 2026 12:00:00 +0100</pubDate><guid>https://riasatislam.com/blog/how-to-bulk-publish-activities-to-padlet/</guid><description>&lt;p&gt;You have changed 30 activity prompts and you do not want to copy-paste them into Padlet one by one.&lt;/p&gt;
&lt;p&gt;That is the problem this guide solves. You will put your activity prompts in a spreadsheet, run one careful check, and then publish them to a Padlet board as new posts.&lt;/p&gt;
&lt;p&gt;This is useful when you prepare seminar questions, starter activities, tutorial prompts, reading responses, exit tickets, or weekly discussion boards.&lt;/p&gt;
&lt;p&gt;This guide is for educators. You do not need to understand web development. The main idea is simple:&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;One row in your spreadsheet becomes one post on your Padlet board.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The example code is available on GitHub:
.&lt;/p&gt;
&lt;h2 id="what-this-guide-does"&gt;What This Guide Does&lt;/h2&gt;
&lt;p&gt;This guide shows how to create new Padlet posts in bulk.&lt;/p&gt;
&lt;p&gt;It does not update or delete existing Padlet posts. Padlet&amp;rsquo;s official public API documentation includes endpoints for creating posts and retrieving board data, so this workflow is best understood as seeding or republishing activity prompts, not editing old posts.&lt;/p&gt;
&lt;h2 id="official-padlet-documentation-used"&gt;Official Padlet Documentation Used&lt;/h2&gt;
&lt;p&gt;These are the real Padlet documentation pages this guide is based on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The important points are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Padlet has a public API that can send posts to boards.&lt;/li&gt;
&lt;li&gt;You need API access and an API key.&lt;/li&gt;
&lt;li&gt;Your API key is sent in the &lt;code&gt;x-api-key&lt;/code&gt; request header.&lt;/li&gt;
&lt;li&gt;You need administrator access to the Padlet board.&lt;/li&gt;
&lt;li&gt;New posts are created with the &lt;code&gt;POST /v1/boards/{board_id}/posts&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;Padlet documents common error codes and a rate limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-you-need"&gt;What You Need&lt;/h2&gt;
&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Padlet account with Public API access.&lt;/li&gt;
&lt;li&gt;Administrator access to the board you want to fill.&lt;/li&gt;
&lt;li&gt;Your Padlet API key.&lt;/li&gt;
&lt;li&gt;The board ID for the Padlet.&lt;/li&gt;
&lt;li&gt;Python installed on your computer.&lt;/li&gt;
&lt;li&gt;A copy of the example GitHub repo:
.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are unsure whether your account can use the API, open your Padlet Developer settings and check whether you can generate an API key. Padlet&amp;rsquo;s own pages describe API access and account requirements; where the wording differs between pages, your own Developer settings are the source of truth.&lt;/p&gt;
&lt;h2 id="step-1-make-your-spreadsheet"&gt;Step 1: Make Your Spreadsheet&lt;/h2&gt;
&lt;p&gt;Create a CSV file. CSV is a plain spreadsheet format that Excel, Google Sheets, and Numbers can export.&lt;/p&gt;
&lt;p&gt;Use these column names:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;row_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;attachment_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;attachment_caption&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;color&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;q1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Starter question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;What is one example of learning by trial and error?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,,,&lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;q2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Pair discussion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Compare supervised learning and reinforcement learning in two bullet points.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,,,&lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;q3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Useful link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Open the reading before answering the prompt.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;https://example.com/reading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Course reading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What each column means:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;What to put there&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;row_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short unique ID, such as &lt;code&gt;q1&lt;/code&gt; or &lt;code&gt;week2-starter&lt;/code&gt;. Keep this the same if you run the tool again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The Padlet post title.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The main activity instructions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachment_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional link to attach to the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachment_caption&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional label for the link.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;color&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional Padlet color: &lt;code&gt;red&lt;/code&gt;, &lt;code&gt;orange&lt;/code&gt;, &lt;code&gt;green&lt;/code&gt;, &lt;code&gt;blue&lt;/code&gt;, or &lt;code&gt;purple&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You can leave optional cells blank.&lt;/p&gt;
&lt;h2 id="step-2-download-the-example-repo"&gt;Step 2: Download the Example Repo&lt;/h2&gt;
&lt;p&gt;Open Terminal on Mac, PowerShell on Windows, or the terminal in your code editor.&lt;/p&gt;
&lt;p&gt;Download the example repo from GitHub:
.&lt;/p&gt;
&lt;p&gt;Install the example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -m venv .venv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -m pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On Windows PowerShell, the activation command is usually:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.\.&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Activate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3-add-your-padlet-details"&gt;Step 3: Add Your Padlet Details&lt;/h2&gt;
&lt;p&gt;Copy the example settings file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open &lt;code&gt;.env&lt;/code&gt; and fill in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PADLET_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_api_key_here
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PADLET_BOARD_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_board_id_here
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keep this file private. Do not upload it to GitHub.&lt;/p&gt;
&lt;h2 id="step-4-do-a-dry-run"&gt;Step 4: Do a Dry Run&lt;/h2&gt;
&lt;p&gt;A dry run is a practice run.&lt;/p&gt;
&lt;p&gt;It checks your spreadsheet and shows what would be posted, but it does not post anything to Padlet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padlet-bulk-publish publish &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --csv examples/activities.csv &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --state published-posts.json &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Read the preview. Check that the titles, instructions, links, and colors look right.&lt;/p&gt;
&lt;h2 id="step-5-publish-to-padlet"&gt;Step 5: Publish to Padlet&lt;/h2&gt;
&lt;p&gt;When the dry run looks correct, publish for real:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padlet-bulk-publish publish &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --csv examples/activities.csv &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --state published-posts.json &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --execute
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The tool will create one new Padlet post for each valid row in the spreadsheet.&lt;/p&gt;
&lt;p&gt;It will also create a local file called &lt;code&gt;published-posts.json&lt;/code&gt;. This file records which spreadsheet rows have already been published.&lt;/p&gt;
&lt;h2 id="step-6-run-it-again-safely"&gt;Step 6: Run It Again Safely&lt;/h2&gt;
&lt;p&gt;If you run the same command again, the tool will skip rows that were already published.&lt;/p&gt;
&lt;p&gt;That matters because Padlet post creation is not the same thing as editing. If the tool created every row every time, you would get duplicates.&lt;/p&gt;
&lt;p&gt;If you change a row after publishing, the tool reports that it changed and skips it. That is intentional. Review the changed row and decide whether to manually edit the Padlet post or publish a new version.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;--force&lt;/code&gt; only if you deliberately want changed rows to be posted again as new posts.&lt;/p&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INVALID_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The API key is wrong or was refreshed.&lt;/td&gt;
&lt;td&gt;Copy the current key from Padlet Developer settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NOT_ADMIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You are not an administrator of the board.&lt;/td&gt;
&lt;td&gt;Use a board you created or ask to be added as an administrator.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NOT_PAYING_USER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The account cannot use the public API.&lt;/td&gt;
&lt;td&gt;Check your Padlet plan or Developer settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PADLET_ARCHIVED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The board is archived.&lt;/td&gt;
&lt;td&gt;Unarchive the Padlet before using the API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PARAMETER_MISSING&lt;/code&gt; or &lt;code&gt;BAD_REQUEST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A spreadsheet row is missing required content or has an invalid value.&lt;/td&gt;
&lt;td&gt;Check that each row has a title, body, or attachment URL. Check the color spelling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RATE_LIMIT_EXCEEDED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Too many API requests were sent too quickly.&lt;/td&gt;
&lt;td&gt;Wait a minute and run the command again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NOT_FOUND&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The board ID is wrong or the board is unavailable to your account.&lt;/td&gt;
&lt;td&gt;Recheck the board ID from Padlet.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="safety-checklist"&gt;Safety Checklist&lt;/h2&gt;
&lt;p&gt;Before using this with a live class board:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test with a private practice Padlet.&lt;/li&gt;
&lt;li&gt;Run a dry run.&lt;/li&gt;
&lt;li&gt;Check every row in the preview.&lt;/li&gt;
&lt;li&gt;Keep your API key private.&lt;/li&gt;
&lt;li&gt;Keep your &lt;code&gt;.env&lt;/code&gt; file out of GitHub and shared folders.&lt;/li&gt;
&lt;li&gt;Keep the &lt;code&gt;published-posts.json&lt;/code&gt; file so reruns do not create duplicates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-this-workflow-helps-most"&gt;When This Workflow Helps Most&lt;/h2&gt;
&lt;p&gt;This workflow is most useful when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You already write activities in a spreadsheet.&lt;/li&gt;
&lt;li&gt;You need to seed many prompts at once.&lt;/li&gt;
&lt;li&gt;You revise activities before each semester.&lt;/li&gt;
&lt;li&gt;You reuse a board structure but change the content.&lt;/li&gt;
&lt;li&gt;You want a repeatable process instead of manual copying.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For small one-off changes, editing directly in Padlet may still be faster.&lt;/p&gt;
&lt;h2 id="final-reminder"&gt;Final Reminder&lt;/h2&gt;
&lt;p&gt;Treat the spreadsheet as your source copy. Treat Padlet as the published classroom space.&lt;/p&gt;
&lt;p&gt;Run a dry run first, publish only when the preview looks right, and keep the state file so you do not accidentally create duplicate posts.&lt;/p&gt;</description></item></channel></rss>