{"id":353290,"date":"2026-08-30T16:46:19","date_gmt":"2026-08-30T16:46:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/servispin\/"},"modified":"2026-08-30T16:46:01","modified_gmt":"2026-08-30T16:46:01","slug":"servispin","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/servispin\/","author":23548489,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.7","stable_tag":"1.7.7","tested":"7.0.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"ServisPin","header_author":"WebFoo","header_description":"Let customers check estimated delivery dates for their pincode. Built for WooCommerce with AJAX lookup, admin pincode management, CSV bulk import\/export, shortcodes, and a persistent delivery bar.","assets_banners_color":"683a29","last_updated":"2026-08-30 16:46:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/webfoo.in\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.7":{"tag":"1.7.7","author":"officialwebfoo","date":"2026-08-30 16:46:01","revision":3672853}},"upgrade_notice":{"1.4.0":"<p>Plugin identity changed to ServisPin (new folder\/file\/text-domain: servispin). If you&#039;re moving from an install named &quot;Pincode Delivery Estimator&quot;, install this as a new plugin and deactivate\/remove the old one \u2014 WordPress treats them as separate plugins, though your existing pincode data, settings, and shortcodes carry over untouched since none of the internal identifiers changed.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3672863,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3672863,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3672863,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3672883,"resolution":"1","location":"assets","locale":"","width":3418,"height":1648},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3672883,"resolution":"2","location":"assets","locale":"","width":3418,"height":1648},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3672883,"resolution":"3","location":"assets","locale":"","width":3418,"height":1648},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3672883,"resolution":"4","location":"assets","locale":"","width":3418,"height":1648},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3672883,"resolution":"5","location":"assets","locale":"","width":3418,"height":1650}},"screenshots":{"1":"Frontend pincode checker widget.","2":"Delivery result \u2014 estimated date, express and COD\/Prepaid badges.","3":"The \"Check Now\" popup.","4":"The persistent delivery bar.","5":"Admin \u2014 pincode management (list, search, filters, bulk actions).","6":"Admin \u2014 Bulk CSV upload, with the sample template download and import summary.","7":"Admin \u2014 Settings screen."}},"plugin_section":[],"plugin_tags":[13827,5142,66014,3546,286],"plugin_category":[45],"plugin_contributors":[278361],"plugin_business_model":[],"class_list":["post-353290","plugin","type-plugin","status-publish","hentry","plugin_tags-delivery","plugin_tags-estimator","plugin_tags-pincode","plugin_tags-shipping","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-officialwebfoo","plugin_committers-officialwebfoo"],"banners":{"banner":"https:\/\/ps.w.org\/servispin\/assets\/banner-772x250.png?rev=3672863","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/servispin\/assets\/icon-128x128.png?rev=3672863","icon_2x":"https:\/\/ps.w.org\/servispin\/assets\/icon-256x256.png?rev=3672863","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/servispin\/assets\/screenshot-1.png?rev=3672883","caption":"Frontend pincode checker widget."},{"src":"https:\/\/ps.w.org\/servispin\/assets\/screenshot-2.png?rev=3672883","caption":"Delivery result \u2014 estimated date, express and COD\/Prepaid badges."},{"src":"https:\/\/ps.w.org\/servispin\/assets\/screenshot-3.png?rev=3672883","caption":"The \"Check Now\" popup."},{"src":"https:\/\/ps.w.org\/servispin\/assets\/screenshot-4.png?rev=3672883","caption":"The persistent delivery bar."},{"src":"https:\/\/ps.w.org\/servispin\/assets\/screenshot-5.png?rev=3672883","caption":"Admin \u2014 pincode management (list, search, filters, bulk actions)."}],"raw_content":"<!--section=description-->\n<p>ServisPin lets customers enter their pincode and instantly see an estimated delivery date for their location \u2014 without leaving the page.<\/p>\n\n<p>A shopper types a 6-digit pincode, the plugin looks it up over AJAX against a database you manage, and shows the delivery estimate (plus an optional expected date, express-delivery badge, and COD\/Prepaid availability) right where they're shopping. It's built for WooCommerce, with AJAX lookup, admin pincode management, CSV bulk import\/export, shortcodes, and a persistent delivery bar that remembers a customer's pincode as they browse.<\/p>\n\n<p><strong>WooCommerce is optional.<\/strong> The shortcodes, admin panel, AJAX lookup, delivery bar, and CSV tools all work on any WordPress site with no WooCommerce dependency. WooCommerce is only used for one specific feature \u2014 an optional compact checker that can appear directly on single product pages \u2014 which simply doesn't appear if WooCommerce isn't installed, with no errors or broken functionality either way.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Pincode delivery lookup over AJAX \u2014 no page reload.<\/li>\n<li>Estimated delivery dates, calculated from your delivery-days data and a configurable daily order-cutoff time (e.g. \"Order before 5 PM today to get it by Fri, 14 Aug\").<\/li>\n<li>WooCommerce integration: an optional compact checker on single product pages, alongside the standard shortcodes.<\/li>\n<li>Admin pincode management: add, edit, activate\/deactivate, search, filter and bulk-manage pincodes from a dedicated screen.<\/li>\n<li>CSV bulk import with duplicate detection and an import summary, plus a downloadable sample CSV template that matches the importer's exact column format.<\/li>\n<li>CSV export of your full pincode list.<\/li>\n<li>Shortcodes: <code>[pincode_delivery_estimator]<\/code> (the full checker widget, also available in a compact style) and <code>[pincode_delivery_message]<\/code> (a small \"Check your delivery date\" prompt, or the customer's last result once they've checked).<\/li>\n<li>A \"Check Now\" popup for looking up or changing a pincode from anywhere on the site.<\/li>\n<li>A persistent delivery bar that remembers the customer's pincode and estimated delivery as they browse, with its own \"Change Pincode\" option that reopens the popup.<\/li>\n<li>Same-Day \/ Express Delivery and COD\/Prepaid availability badges, settable per pincode.<\/li>\n<li>A custom, indexed database table so lookups stay fast even with a large pincode list.<\/li>\n<li>Fully namespaced CSS (a <code>.pde-<\/code> prefix throughout) so the plugin's styles don't clash with your theme or other plugins.<\/li>\n<li>Nonces, capability checks, sanitized input, escaped output, and prepared SQL queries throughout; a lightweight rate limit on the public lookup endpoint to reduce automated abuse.<\/li>\n<li>Uninstall data removal is opt-in \u2014 nothing is deleted unless you explicitly turn that on in Settings.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>ServisPin does not send your customers' pincode lookups, delivery data, or any store data to any external server. All pincode lookups are handled entirely by your own WordPress site's database and AJAX endpoint \u2014 nothing about what a customer searches for leaves your site.<\/p>\n\n<p><strong>Rate limiting.<\/strong> To reduce scripted abuse of the public pincode-lookup endpoint, the plugin temporarily hashes (MD5) the visitor's IP address and uses that hash as a counter key in a short-lived WordPress transient (auto-expires after 60 seconds). The raw IP address itself is never stored, never logged, and never transmitted anywhere \u2014 only the hash-based counter exists, and only for one minute.<\/p>\n\n<p><strong>Uninstall feedback (fully optional).<\/strong> When an administrator deletes ServisPin from the Plugins screen, an optional feedback popup appears. Nothing is sent unless the administrator explicitly clicks \"Submit Feedback\" \u2014 clicking \"Skip &amp; Uninstall\" (or simply not submitting) sends nothing at all. If feedback is submitted, it is emailed via WordPress's native <code>wp_mail()<\/code> to the developer (webfoo.in@gmail.com) and contains only: the selected reason, the typed feedback text, the plugin version, the WordPress version, the PHP version, and the date\/time. It never includes the site's URL, the administrator's identity or email address, IP addresses, cookies, or any authentication data.<\/p>\n\n<p><strong>Local storage.<\/strong> To remember a customer's last-checked pincode between page loads, the frontend widget stores that pincode and its delivery result in the visitor's own browser (via <code>localStorage<\/code>). This data stays on the visitor's device \u2014 it is not a cookie, and it is not sent to or stored on the server beyond the normal AJAX lookup that produced it.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>ServisPin does not load any external service, font, API, analytics, or tracking script anywhere in the plugin. All CSS, JavaScript, and fonts are bundled locally and served from your own site \u2014 nothing is fetched from Google, a CDN, or any other third-party domain. (Earlier versions loaded the \"Poppins\" font from Google Fonts for the frontend widget; this has been replaced with the operating system's own font, so no such request is made anymore.)<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Go to Plugins \u2192 Add New in your WordPress dashboard.<\/li>\n<li>Search for \"ServisPin\".<\/li>\n<li>Install and activate ServisPin.<\/li>\n<li>Open <strong>ServisPin \u2192 Add Pincode<\/strong> to add your delivery data manually, or <strong>ServisPin \u2192 Bulk Upload<\/strong> to import it from a CSV file (a sample template is available on that screen).<\/li>\n<li>Visit <strong>ServisPin \u2192 Settings<\/strong> to configure the checker's text, colors, the persistent delivery bar, and order-cutoff\/express-delivery options.<\/li>\n<li>Add the <code>[pincode_delivery_estimator]<\/code> shortcode to any page, post, or shortcode-compatible page builder block where you want the checker to appear \u2014 or use <code>[pincode_delivery_message]<\/code> for a smaller \"Check your delivery date\" prompt.<\/li>\n<li>On a WooCommerce store, optionally enable the compact checker on product pages from Settings.<\/li>\n<li>Test a pincode lookup as a customer would, to confirm your delivery data and messaging look right.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20servispin%20work%20with%20woocommerce%3F\"><h3>Does ServisPin work with WooCommerce?<\/h3><\/dt>\n<dd><p>WooCommerce is not required \u2014 the shortcodes, admin panel, AJAX lookup, and delivery bar all work on any WordPress site without it. When WooCommerce is active, ServisPin can additionally show a compact delivery checker directly on single product pages (via the <code>woocommerce_single_product_summary<\/code> hook), toggleable from Settings.<\/p><\/dd>\n<dt id=\"can%20i%20import%20pincode%20data%20in%20bulk%3F\"><h3>Can I import pincode data in bulk?<\/h3><\/dt>\n<dd><p>Yes, via <strong>ServisPin \u2192 Bulk Upload<\/strong>. Upload a CSV with <code>pincode<\/code> and <code>delivery_days<\/code> columns (optionally <code>city<\/code>, <code>state<\/code>, <code>express_available<\/code>); existing pincodes are updated, new ones are added, and you get an import summary (total, added, updated, invalid\/skipped rows).<\/p><\/dd>\n<dt id=\"can%20i%20download%20a%20sample%20csv%3F\"><h3>Can I download a sample CSV?<\/h3><\/dt>\n<dd><p>Yes. The Bulk Upload screen has a \"Download Sample CSV Template\" button that generates a CSV using the exact column headers the importer expects, with a few example rows, so you can fill it in and re-upload it directly.<\/p><\/dd>\n<dt id=\"can%20i%20export%20pincode%20data%3F\"><h3>Can I export pincode data?<\/h3><\/dt>\n<dd><p>Yes, from <strong>ServisPin \u2192 Import\/Export<\/strong>, as a CSV containing all your pincode records.<\/p><\/dd>\n<dt id=\"does%20servispin%20support%20ajax%20lookup%3F\"><h3>Does ServisPin support AJAX lookup?<\/h3><\/dt>\n<dd><p>Yes. The customer-facing checker (in the shortcode widget, the \"Check Now\" popup, and the product-page checker) looks up a pincode over AJAX and shows the result without reloading the page. The pincode is validated and sanitized server-side regardless of what the browser sends.<\/p><\/dd>\n<dt id=\"can%20customers%20change%20their%20pincode%3F\"><h3>Can customers change their pincode?<\/h3><\/dt>\n<dd><p>Yes. Once a customer has checked a pincode, a \"Change\" link (in the message shortcode and the persistent delivery bar) reopens the same popup so they can look up a different one. The last checked pincode is also remembered (via the browser's local storage) and automatically re-verified on the next page load.<\/p><\/dd>\n<dt id=\"does%20servispin%20support%20shortcodes%3F\"><h3>Does ServisPin support shortcodes?<\/h3><\/dt>\n<dd><p>Yes, two: <code>[pincode_delivery_estimator]<\/code> (the full checker widget; add <code>style=\"compact\"<\/code> for a smaller version) and <code>[pincode_delivery_message]<\/code> (a compact \"Check your delivery date\" prompt\/result).<\/p><\/dd>\n<dt id=\"can%20i%20use%20servispin%20with%20elementor%3F\"><h3>Can I use ServisPin with Elementor?<\/h3><\/dt>\n<dd><p>Yes. Both shortcodes render through WordPress's standard shortcode mechanism, so they work inside Elementor's Shortcode widget the same way any other shortcode does.<\/p><\/dd>\n<dt id=\"can%20i%20use%20servispin%20with%20gutenberg%3F\"><h3>Can I use ServisPin with Gutenberg?<\/h3><\/dt>\n<dd><p>Yes, via the core Shortcode block, for the same reason \u2014 no special integration is required.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20servispin%20delete%20my%20data%3F\"><h3>Does uninstalling ServisPin delete my data?<\/h3><\/dt>\n<dd><p>No, not unless you explicitly opt in. Under <strong>ServisPin \u2192 Settings<\/strong>, \"Delete Data on Uninstall\" is OFF by default \u2014 your pincode table and settings are preserved unless you turn that on before deleting the plugin. When you do delete the plugin from the Plugins screen, you'll also see an optional, skippable feedback prompt \u2014 it never blocks deletion and is never sent unless you choose to submit it.<\/p><\/dd>\n<dt id=\"is%20the%20public%20pincode-lookup%20endpoint%20safe%20from%20abuse%3F\"><h3>Is the public pincode-lookup endpoint safe from abuse?<\/h3><\/dt>\n<dd><p>The lookup endpoint is intentionally public (customers aren't logged in when checking delivery). It validates and sanitizes the pincode server-side, verifies a nonce, and applies a lightweight per-IP rate limit to reduce scripted abuse without affecting normal shoppers.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>Removed the Google Fonts (Poppins) request that loaded automatically whenever the frontend widget, delivery bar, or modal rendered. The frontend now uses the visitor's operating-system font instead, so nothing is fetched from fonts.googleapis.com or any other third-party host.<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Renamed remaining \"pde-\" admin page slugs and \"pde_\" query-string flags to \"servispin-\"\/\"servispin_\" (WordPress.org review). Old bookmarked \"pde-*\" admin URLs redirect automatically to the new ones.<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Fixed 5 Plugin Check errors: added missing <code>\/* translators: *\/<\/code> comments for <code>%d<\/code> placeholders in the CSV import summary and export panel.<\/li>\n<li>Addressed Plugin Check's \"nonce verification recommended\" warnings on read-only search\/filter\/sort\/pagination parameters and other display-only reads, with explanatory comments confirming each one \u2014 every action that actually reads, writes, or deletes data was already nonce-verified.<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Fixed the Bulk Upload CSV dropzone: it was styled to look like a drag-and-drop area, but had no actual drag\/drop handling \u2014 dropping a file onto it did nothing. Dragging and dropping a CSV file now works, with visual feedback while dragging and the chosen file's name shown once dropped or selected.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Dashboard now shows the new <code>[servispin_delivery_estimator]<\/code> \/ <code>[servispin_delivery_message]<\/code> shortcodes as the primary ones, with a note that the older <code>[pincode_delivery_estimator]<\/code> \/ <code>[pincode_delivery_message]<\/code> names still work for existing content.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fixed the CSV bulk-upload summary undercounting failures: if a database-level update genuinely failed during import, the row was still counted as \"Updated\" instead of \"Invalid \/ Skipped\".<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fixed a bug introduced in 1.7.0: the Settings, Add\/Edit Pincode, and Bulk Upload (CSV) form submit buttons were still named <code>pde_save_settings<\/code> \/ <code>pde_save_pincode<\/code> \/ <code>pde_bulk_upload<\/code>, but the save handler was checking for the new <code>servispin_*<\/code> names. This meant nothing typed on those three forms was ever saved \u2014 no error was shown, it just silently didn't take effect. Deleting and toggling status (which use link-based actions, not these forms) were unaffected. All three buttons now match the handler and save correctly.<\/li>\n<li>Removed the manual <code>load_plugin_textdomain()<\/code> call. WordPress.org-hosted plugins have had their translations auto-loaded since WP 4.6, so the call was redundant (per WordPress.org Plugin Check).<\/li>\n<li>Renamed the two remaining generic error codes (<code>pde_duplicate<\/code>, <code>pde_db_error<\/code>) to <code>servispin_duplicate<\/code> \/ <code>servispin_db_error<\/code> for full identifier-prefix consistency.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Internal code-quality\/compliance update: migrated the plugin's internal PHP prefix from the too-short <code>PDE<\/code>\/<code>pde<\/code> to the unique <code>ServisPin<\/code>\/<code>servispin<\/code> (classes, constants, the global bootstrap function, AJAX actions, hooks, nonces, the settings group, and script\/style handles). This addresses WordPress.org Plugin Check's \"prefix too short\" requirement.<\/li>\n<li>Added new, uniquely prefixed shortcodes <code>[servispin_delivery_estimator]<\/code> and <code>[servispin_delivery_message]<\/code>. The original <code>[pincode_delivery_estimator]<\/code> and <code>[pincode_delivery_message]<\/code> continue to work unchanged for existing content.<\/li>\n<li>Existing installs are migrated automatically and safely: saved settings, last-import date, and a visitor's last-checked pincode (stored in their browser) all carry over to the new internal names the first time the updated plugin runs \u2014 nothing is lost, and the migration only runs once.<\/li>\n<li>No functional, behavioral, or UI changes. CSS class names, the database table name, and admin page URLs are unchanged in this release \u2014 see readme\/plugin comments for why.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Redesigned the ServisPin \u2192 Bulk Upload page: numbered step cards, a \"Template Columns\" reference box, and a \"Requirements\" sidebar. This is a visual\/UI change only \u2014 the upload form, file input, nonce, sample-CSV download, and import logic are all unchanged. (The Requirements box now correctly shows the real 10MB file-size limit already enforced by the importer.)<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Redesigned the ServisPin \u2192 Dashboard page: icon-badged stat cards, a version badge next to the title, and restyled quick-action buttons and shortcode chips. This is a visual\/UI change only \u2014 every statistic, link, and shortcode still comes from the exact same data\/logic as before.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Redesigned the ServisPin \u2192 Settings page into a dashboard-style layout: card-grouped sections, toggle switches, and selectable Design 1\/2 cards. This is a visual\/UI change only \u2014 every setting keeps its original name, default value, and save behavior; nothing was renamed, removed, or restructured in the database.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added a second frontend widget design (\"Design 2\") as an optional alternative \u2014 selectable from ServisPin \u2192 Settings \u2192 Design. Design 2 groups the delivery result into a tinted panel with divider lines and an accent bar, instead of Design 1's connected-circle timeline.<\/li>\n<li>Design 1 (the original layout) is unchanged and remains the default \u2014 existing sites keep looking exactly as before after updating; no action is required.<\/li>\n<li>Both designs share the exact same AJAX lookup, delivery-date calculation, validation, loading\/error handling, and admin color settings \u2014 only the presentation differs.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Redesigned the frontend delivery result as a vertical timeline (checkmark, date, location, then Express\/COD\/Prepaid rows connected by a line, ending in an order-cutoff box) \u2014 used consistently by the main widget, the \"Check Now\" popup, and the WooCommerce product-page checker.<\/li>\n<li>All timeline colors are still driven dynamically by the existing admin color settings (button\/border colors) \u2014 no new hardcoded colors were introduced.<\/li>\n<li>No changes to AJAX behavior, delivery-date calculation, shortcodes, database, or settings \u2014 this release is frontend markup\/CSS only.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>WordPress.org submission preparation: the plugin's folder, main file, and text domain changed from <code>pincode-delivery-estimator<\/code> to <code>servispin<\/code> to match the final public plugin identity. Internal identifiers that existing installs rely on \u2014 the database table, option names, AJAX actions, shortcodes (<code>[pincode_delivery_estimator]<\/code>, <code>[pincode_delivery_message]<\/code>), and CSS classes \u2014 are all unchanged, so existing pincode data and shortcode usage in your content continue working without edits.<\/li>\n<li>Updated <code>readme.txt<\/code> Contributors to the confirmed WordPress.org account (<code>officialwebfoo<\/code>).<\/li>\n<li>Added <code>== Privacy ==<\/code> and <code>== External Services ==<\/code> sections documenting the plugin's rate-limiting IP hashing, the optional uninstall-feedback email, local-storage usage, and the Google Fonts request \u2014 accurately reflecting the existing implementation, with no new data collection introduced.<\/li>\n<li>Clarified in the README that WooCommerce is optional \u2014 only the product-page compact checker requires it; every other feature works on any WordPress site.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Hardened the uninstall-feedback popup's delete-link detection with a third, independent fallback (matching WordPress core's <code>id=\"delete-{slug}\"<\/code> pattern), in case a site's markup doesn't match the first two detection strategies.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Shortened the readme.txt short description to 146 characters (from ~196) for WordPress.org's directory\/search display convention. The full description remains in the Description section.<\/li>\n<li>No functional code changes in this release \u2014 documentation\/metadata only.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Rebranded the plugin as ServisPin (Plugin Name, Author, Author URI, and description updated). The plugin slug, text domain, database table, and shortcode names are unchanged, so existing installs keep working without reconfiguration.<\/li>\n<li>Added an optional, skippable uninstall feedback prompt on the Plugins screen. Submitting it emails the feedback via <code>wp_mail()<\/code>; skipping it \u2014 or any failure to send \u2014 never blocks or delays uninstalling, and the existing opt-in data-deletion behavior in <code>uninstall.php<\/code> is unchanged.<\/li>\n<li>Added a \"Download Sample CSV Template\" button on the Bulk Upload screen, generating a CSV with the exact columns the importer expects.<\/li>\n<li>Updated readme.txt with Features, expanded FAQ, and Screenshots sections for WordPress.org.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed: PHP 8+ \"Undefined array key\" warning in <code>PDE_Database::update()<\/code> on partial updates (e.g. activate\/deactivate), which only ever send a <code>status<\/code> field.<\/li>\n<li>Hardened: CSV export now neutralizes values that start with <code>=<\/code>, <code>+<\/code>, <code>-<\/code>, or <code>@<\/code> to prevent spreadsheet formula injection when opened in Excel\/Sheets. Normal values (city, state, pincode, delivery estimate) are unaffected.<\/li>\n<li>Hardened: CSV bulk-upload validation now also checks the file against WordPress' allowed-mimes list, in addition to the file extension.<\/li>\n<li>Added a lightweight, transient-based per-IP rate limit on the public pincode-lookup endpoint to reduce scripted abuse. No login required, no data stored beyond a short-lived hashed-IP counter, and the limit is generous enough not to affect normal shoppers.<\/li>\n<li>Removed an unnecessary <code>flush_rewrite_rules()<\/code> call on deactivation (the plugin registers no rewrite rules, post types, or taxonomies).<\/li>\n<li>i18n: translation function calls now use a literal text-domain string as required by WordPress.org translation tooling.<\/li>\n<li>Added License \/ License URI to the plugin header and readme, plus FAQ and Screenshots sections in readme.txt.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><code>[pincode_delivery_message]<\/code> no longer renders blank before a search \u2014 it now shows a \"Check your delivery date\" prompt with a \"Check Now\" link.<\/li>\n<li>Added a popup modal for checking delivery \u2014 opened from the message shortcode's \"Check Now\" link and the top bar's \"Change Pincode\" button.<\/li>\n<li>New Settings fields to customize the prompt and link text.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: after a page refresh, the checker widget only pre-filled the last searched pincode but didn't show its result \u2014 the customer had to search again. It now automatically re-checks and displays the result (with a freshly recalculated delivery date) on load.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added expected delivery date + \"order before X to get it by Y\" urgency messaging (configurable daily cutoff time).<\/li>\n<li>Added Same-Day \/ Express Delivery badge, settable per pincode (Add\/Edit screen or CSV <code>express_available<\/code> column).<\/li>\n<li>Added COD \/ Prepaid availability badges in the result box.<\/li>\n<li>New <code>express_available<\/code> database column (auto-added on upgrade via dbDelta \u2014 no manual migration needed).<\/li>\n<li>CSV export now includes <code>express_available<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed compact widget spacing\/border on product pages.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Let customers check estimated delivery dates for their pincode with WooCommerce AJAX lookup, CSV tools, shortcodes, and a persistent delivery bar.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/353290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=353290"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/officialwebfoo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=353290"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=353290"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=353290"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=353290"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=353290"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=353290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}