=== CalendarDrop ===
Contributors: thejoshpenner
Tags: events, calendar, ai, import, flyer
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 1.3.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Turn flyers, PDFs, Word documents, and forwarded email text into draft events. Use your own AI key or optional CalendarDrop processing.

== Description ==

Upload a flyer, PDF or Word document. CalendarDrop reads the event details and saves a WordPress draft. Check it, make any edits, and publish.

With The Events Calendar active, imports become calendar events. Without it, they become ordinary WordPress posts with event details. The Events Calendar is a separate plugin by StellarWP.

Use your own AI provider key and pay that provider directly, or use optional CalendarDrop credits. The plugin is free either way.

**Try your first import**

CalendarDrop offers five event drafts to try, with no card and no separate AI key required. Install and activate the plugin, then follow the [setup guide](https://calendardrop.pennerstrategy.com/help) to connect your site. Installing or connecting does not start a paid subscription. Your CalendarDrop account shows current plans, availability and terms.

**What you can import**

* Flyer images, PDFs and Word (.docx) documents.
* Email text forwarded through a separately configured service such as Mailgun or Postmark.
* Files submitted through an optional upload page for people you trust. This page is off by default.

Every imported event starts as a draft. Choose a category for a file to apply it to all the events it contains. Where available, CalendarDrop also uses the flyer as a featured image.

If an event matches an earlier import, you can skip it, create a separate draft for review, or merge details into an existing draft. CalendarDrop leaves published and other non-draft events unchanged.

Word imports read the main document text, not embedded images, headers or footers. Export designed Word flyers as PDF. CalendarDrop credits and Gemini process the complete PDF. Other BYO providers use its complete browser-extracted text; scanned PDFs need a provider that accepts native PDFs. CalendarDrop never substitutes a first-page thumbnail for the document.

**Use your own AI provider**

Choose OpenAI, Google Gemini or Anthropic Claude, or configure an OpenAI-compatible endpoint. Enter the API address and model supplied by your provider. Add a key if the server requires one, save your settings, then click **Test Connection**.

Custom endpoints must support the plugin's chat-completions request format. A model that accepts text may not accept images. A successful connection test checks a short text request, not flyer accuracy or every file type. Local servers must be reachable from the computer hosting WordPress; an address on your laptop is not automatically reachable from your website.

Your provider key stays in your site's WordPress database and goes only to the endpoint you configure. Review that provider's terms and privacy policy before use. AI troubleshooting and AI edits use your own provider key.

== Third-Party Services / Privacy ==

**Using your own AI key.** File and authenticated email/webhook imports, connection tests, diagnostics and AI edits send relevant content or prompts to your chosen provider. This may include event text, images, complete PDFs or extracted PDF/Word text. Your key stays in your WordPress database and is sent only to your configured provider, never to CalendarDrop.

**Optional CalendarDrop processing.** Opening **CalendarDrop > Subscription** sends your site URL to https://calendardrop.pennerstrategy.com, operated by Joshua Penner, for status and plans. Connecting sends your connection code or license key and stores a private site token for account checks. Connecting does not change your processing mode.

When you select subscription mode, imports send submitted text, images, complete PDFs or Word document-body text, plus your site URL, timezone and date/time, to CalendarDrop. The service forwards the material to Google Gemini to extract event details. It uses its own AI key.

**Payments.** Polar receives account email, customer identity and license/site details for checkout, billing and license verification. Card details are handled by Polar, not this plugin. [Polar privacy](https://polar.sh/legal/privacy-policy).

**Storage.** Your site retains uploads, drafts and import records; recovery records have no automatic cleanup. CalendarDrop retains account, usage and billing records, plus extracted results for recovery. See the [data-use and retention policy](https://calendardrop.pennerstrategy.com/privacy) and [service terms](https://calendardrop.pennerstrategy.com/terms).

Supported providers and their terms:

* OpenAI: https://openai.com: Terms: https://openai.com/policies/terms-of-use: Privacy: https://openai.com/policies/privacy-policy
* Google Gemini: https://ai.google.dev: Terms: https://ai.google.dev/gemini-api/terms: Privacy: https://policies.google.com/privacy
* Anthropic Claude: https://www.anthropic.com: Terms: https://www.anthropic.com/legal/consumer-terms: Privacy: https://www.anthropic.com/legal/privacy

**Google Places (optional).** If you supply your own Google Maps API key and an event has a venue name, CalendarDrop sends that venue/location name to the Google Places API to look up address details. Nothing is sent to Google Places unless you have configured a Google Maps key. Google Terms: https://cloud.google.com/maps-platform/terms: Privacy: https://policies.google.com/privacy

== Installation ==

1. Upload the `calendardrop` folder to `/wp-content/plugins/`, or upload the zip directly from Plugins > Add New > Upload Plugin.
2. Activate CalendarDrop through the Plugins menu.
3. Open **CalendarDrop** in the WordPress admin menu.
4. Use your own AI key in Settings, or open **CalendarDrop > Subscription** to connect your site and select **Use CalendarDrop credits**. For your own key, save your settings and click **Test Connection** before importing.
5. Optional: install and activate The Events Calendar so imports become native calendar events. Without it, CalendarDrop creates standard draft posts instead.

== Frequently Asked Questions ==

= Can an AI assistant or another app send events to CalendarDrop? =

Yes. A site owner can configure an integration to send event text to the existing authenticated WordPress webhook. CalendarDrop uses the site's selected processing mode and creates drafts for review. Copy the Webhook Target URL from CalendarDrop > Settings > Advanced Integrations and store the webhook secret privately in your integration. The guide covers the exact request, limits, per-event results, duplicates and recovery. It does not require an AI assistant, and it does not provide a separate hosted extraction API.

[Setup and integration guide](https://calendardrop.pennerstrategy.com/integrations) | [Plain-text reference](https://calendardrop.pennerstrategy.com/integrations.md)

= Can CalendarDrop connect directly to Google Calendar or Outlook? =

CalendarDrop creates drafts in The Events Calendar, or ordinary WordPress draft posts if that plugin is inactive. It does not connect to Google Calendar or Outlook accounts. WordPress posts with event details have an Add to Google Calendar link. Public posts and events without password protection can also be exported as an iCalendar file. These are manual exports, not ongoing calendar sync. Other WordPress calendar plugins are not supported.

= Do I need an AI provider API key? =

Only if you choose to use your own AI provider. To use CalendarDrop instead, connect your site, select **Use CalendarDrop credits**, and check that you have credits available.

= Which AI providers are supported? =

OpenAI, Google Gemini and Anthropic Claude have built-in settings. You can also configure an OpenAI-compatible endpoint. Custom services and local servers need a compatible API and a model that accepts your input type. Compatibility and extraction quality vary; test your model with a representative file before relying on it.

= Does it require The Events Calendar? =

No. With The Events Calendar active, imports become calendar events. Without it, CalendarDrop creates ordinary WordPress draft posts with event details.

= Are events published automatically? =

No. Everything CalendarDrop creates is a draft. You review and publish each event yourself. This includes email and webhook imports.

= What does CalendarDrop automate? =

CalendarDrop extracts event details and creates drafts from submitted files and authenticated email/webhook text. Subscription mode also has an event-text form. It does not monitor websites or poll calendar feeds. Review and publish each draft yourself. Pending subscription credit confirmations can retry in the background without repeating extraction.

= How does the public dropzone work? =

CalendarDrop can expose a public dropzone where someone can submit a flyer without logging in. It is off by default. When you enable it, the link is protected by a secret, uploads are rate-limited and validated server-side, and every submission still becomes a draft for your review.

= How do I set up email or webhook forwarding? =

Open Advanced Integrations and connect an inbound-email service such as Postmark or Mailgun. It forwards the email body to CalendarDrop's protected webhook, which creates drafts and records the result. The email service needs separate setup and may charge a fee. CalendarDrop does not provide an inbox. You do not need email forwarding to upload files.

= How do categories work? =

You can assign a category to an upload. Every event imported from that upload is automatically filed under that category, which lets you build separate, filtered calendar views.

= Is it really free? =

Yes. Use your own AI key with the free plugin and pay your provider for any usage charges. CalendarDrop credits are optional and have separate plans and billing.

= Where can I ask a question or share feedback? =

For CalendarDrop questions, bug reports, or feedback, email josh@pennerstrategy.com. Include your WordPress and CalendarDrop versions and a short description of what happened.

= Where is my API key stored, and is it sent to you? =

Your BYO provider key lives in your site's WordPress options database. It is sent only to the AI provider you configure, never to the CalendarDrop subscription service. Subscription mode stores a separate private site token for requests to its configured service.

Deleting the plugin removes local subscription credentials and job records. It does not cancel a service subscription or release unresolved service reservations. Resolve pending imports and manage billing from the service account before removing the plugin.

== Changelog ==

= 1.3.6 =
* Correct the setup FAQ: Claude uses extracted PDF text in this plugin. CalendarDrop credits and Gemini receive the complete PDF.

= 1.3.5 =
* Add an explicit Other / local OpenAI-compatible provider option, including servers that do not require an API key.
* Keep the selected server and model when pasting a key. Clear the key field when changing servers and prevent saved-key fallback to a different address.
* Reject incomplete or malformed responses from the custom provider path.
* Replace simulated upload stages with one processing status and clearer messages for partial results and interrupted imports.
* Clarify setup, credits and draft review in the plugin and guide.

= 1.3.4 =
* Compare extracted details with currently saved values when an import matches an existing event or displays a previous result.
* Show date, time, venue and available timezone/all-day context without changing saved events; label missing information and historical results clearly.
* Keep the flyer analysis button and comparison tables readable on narrow screens.

= 1.3.3 =
* Show the selected processing mode and missing setup before choosing or preparing a flyer.
* Explain saved subscription connections when own-provider mode is selected, with direct links to both setup routes.
* Keep file selection and analysis disabled until required settings are saved, without changing modes or making a connection check automatically.

= 1.3.2 =
* Show each imported event's outcome and a direct review link, instead of opening every draft on the site.
* Clearly distinguish new drafts, skipped duplicates, previous results and failures while preserving saved edits.
* Keep partial results reviewable, handle incomplete records safely, and avoid claiming success when a request times out.

= 1.3.1 =
* Add a public setup and authenticated webhook reference for site owners, integrations and AI assistants.
* Clarify supported calendar destinations, manual exports and the absence of automatic calendar synchronization.
* Correct stale scheduled-feed wording. Website monitoring and feed polling are not supported.

= 1.3.0 =
* Keep complete native PDF bytes, reject preview-only PDF imports, bound expanded Word XML, and show clear repeated/empty import results.
* Remove local subscription secrets and receipts on plugin deletion.
* Add an optional CalendarDrop service connection with a private site token, draft-based credits, and pending settlement recovery. Service availability and purchases are managed separately in the CalendarDrop account.
* Preserve direct AI provider mode and draft review requirements.


= 1.2.4 =
* Require editorial review for all imports, including sites with an older automatic-publish setting.
* Keep published and other non-draft events unchanged when a duplicate import requests a merge.
* Clarify supported imports and duplicate-review behavior.

= 1.2.3 =
* Correct the description and upload error messages to match the supported file-upload and authenticated email/webhook import paths.
* Clarify the separate inbound-email service requirement and the absence of a paste-text import screen.

= 1.2.2 =
* Prevent calendar-property injection by escaping all newline forms in exported event text at output.

= 1.2.1 =
* Prevent public calendar exports from disclosing draft, private, pending, scheduled, trashed, or password-protected event content.
* Reject malformed export IDs and verify post visibility before reading event data.
* Update compatibility metadata after local WordPress 7.1 activation and calendar-export regression checks.

= 1.2.0 =
* Enqueue all scripts/styles per WordPress.org guidelines.

= 1.1.9 =
* Removed the website-import reader so the plugin only processes flyers, PDFs, Word documents, and forwarded email/webhook text.

= 1.1.8 =
* Events now pull a featured image from the flyer (image files and PDF page 1).
* Added the built-in AI diagnostic assistant with formatted, plain-language responses.
* Added per-upload categories for filtered calendar views.
* All assets are now bundled locally (no external CDN or font requests); public credit attribution defaults to off.
* Hardened the public upload and email/webhook paths (rate limiting, server-side validation, secret authentication).
