INTEGRATIONS
Connect event sources and AI tools.
CalendarDrop turns event information into editable WordPress drafts. An automation or AI tool that can make an authenticated HTTP request can submit event text to your WordPress site's CalendarDrop webhook.
This guide describes CalendarDrop 1.3.0. Read the web version, get setup help, or get the WordPress plugin.
Is this the right connection?
Use this workflow when you have permission to process incoming event details and want an editor to review drafts on a WordPress site. A community calendar, venue or local publication can use it to reduce repeated event entry.
- With The Events Calendar active, CalendarDrop creates native event drafts with dates, times and other extracted details.
- Without The Events Calendar, it creates ordinary WordPress draft posts with event metadata. Subscription credits still apply to those created drafts.
- CalendarDrop does not publish imports automatically. Review the source against the draft before publishing. AI can omit or misinterpret details.
- CalendarDrop adds a manual Google Calendar event link to ordinary posts with event metadata. It also provides individual
.icsexports for publicly viewable, unprotected posts and The Events Calendar events. These are manual add/export options, not connected calendar accounts or automatic synchronization. Check the imported date and time in the destination calendar.
If your goal is to write directly to Google Calendar or Outlook, continuously synchronize calendars, or insert an already structured event without AI extraction, this webhook is not that connection. There is no dedicated CalendarDrop MCP server or agent SDK described here. Use your tool's ordinary HTTP integration.
Set up the WordPress site
- Install and activate CalendarDrop. Activate The Events Calendar if you want native calendar events. In WordPress Settings → General, select a named city timezone such as Los Angeles.
- Choose how to pay for processing. My own AI provider and billing uses the provider, model and credentials configured in CalendarDrop's settings; a CalendarDrop subscription is not required. CalendarDrop subscription allowance includes processing and uses your site's event credits.
- For the allowance option, open CalendarDrop → Subscription. Follow the account connection steps for your trial or paid license. Then select CalendarDrop subscription allowance and choose Save processing mode. Connecting an account alone does not switch the mode. See the full connection steps.
- Open CalendarDrop → Settings → Advanced Integrations → Technical Webhook Details. Copy Webhook Target URL and configure the Secret Token in your integration's secure credential store. Use the generated URL because WordPress permalink settings can change its form.
- Authorize the integration for the intended source and site. Start with one fictional event, inspect the response and review the resulting draft. Even a test import can use provider processing and a draft credit.
Only the site owner or an authorized administrator should connect an integration. Do not paste webhook secrets, account connection codes, license keys, provider keys or passwords into a chat or model prompt. Configure authentication outside the model's event text. If a webhook secret is exposed, regenerate it in WordPress and update the authorized integration.
Submit event text
Send POST to the copied WordPress webhook URL, usually https://your-wordpress-site.example/wp-json/calendardrop/v1/ingest.
Set these headers in the integration:
Content-Type: application/json
X-CalendarDrop-Secret: <secret supplied by the credential store>Example JSON body, using a fictional event:
{
"subject": "Fictional event submission",
"text": "Paper Lantern Making Circle. July 16, 2038, 6:00 PM to 7:15 PM, America/Los_Angeles. Venue: Alder Workshop Room. Organizer: Fictional Lantern Collective. Admission: Free. Website: https://example.org/lantern-circle. Bring plain paper. Materials provided."
}text is the event source. Include the actual event title, date, local time, location and other available details there. subject is an optional log label, not a substitute for the event body. An optional sender string can carry the submitting sender; omit it if it is not needed. If no event website is extracted, the plugin may use the sender's non-consumer email domain as a fallback website, so include the event's real URL when known.
The webhook also accepts form fields and common email-forwarding aliases: body-plain, stripped-text, TextBody, text, then body, in that order. Send one body field, as a string. Subject aliases are subject and Subject; sender aliases are sender, from and From. An email-forwarding service must be configured separately; CalendarDrop does not supply a mailbox.
The supported input is source text for extraction. This route does not accept an events array for direct insertion, fetch a URL's contents, or process attachments merely because their names or links appear in the body. Use the upload workflow for files. Use the secret header rather than placing a secret in a URL that could be logged or shared.
Limits and credits
- Subscription text must be nonempty valid UTF-8, at most 30,000 characters and 120,000 bytes. A response can contain up to 30 events. Make sure your allowance covers the expected number of new drafts.
- Own-provider webhook requests remain subject to your host and provider limits. The subscription text cap is not a promise about every own-provider configuration.
- One new subscription draft uses one credit. Skipped duplicates and failed draft creations release their reservations after WordPress confirms the outcome. An empty result uses no draft credits. A flagged duplicate that creates a new review draft is still a new draft.
- Processing limits are separate from draft credits. Repeated attempts, service capacity or an account needing review can prevent a new import even when credits remain. No throughput or unlimited retry guarantee is made.
- Send one request at a time per site. Subscription imports use a local lock while creating drafts and confirming outcomes.
See current plans and service terms before choosing a paid allowance.
Read the result before taking another action
A successful response contains event IDs, per-event results and summary counts. This illustrative subset shows one created draft; actual results include additional fields:
{
"status": "success",
"event_id": 123,
"events_created": 1,
"events_merged": 0,
"events_skipped": 0,
"events_failed": 0,
"total_events": 1,
"events": [
{
"event_id": 123,
"status": "success",
"message": "Event imported successfully."
}
]
}HTTP 200 alone does not mean every event succeeded. Inspect events_failed, the other counts and each item in events. Event statuses can include success, fallback_success, skipped, merged and error. The overall status can also be batch_success. Messages are for people and may change; do not use their exact wording as a machine contract. An edit_link can be empty for an unauthenticated webhook caller. Review drafts through WordPress.
For subscription imports, replayed: true means CalendarDrop returned an existing result. It retains the original counts, which do not describe new creations on this request. A subscription_notice can mean drafts were saved but their credit confirmation is pending. Check WordPress and choose CalendarDrop → Subscription → Retry pending confirmations instead of resubmitting just to confirm credits.
Duplicates, interruptions and errors
Default duplicate handling skips a matching event. The plugin uses title/date-based checks, not an event ID supplied by your integration. Optional flag handling creates a separate review draft; merge updates an existing draft and skips non-drafts. Check your site's setting before automating submissions. Own-provider mode can make an AI request before identifying a duplicate.
The WordPress webhook does not accept a caller-controlled idempotency key. Subscription mode derives its own source, site, timezone and date identity and can recover recorded results. Do not assume an indefinite exactly-once guarantee across changed text, dates or site configuration.
If a request times out, stop automatic retries. Check the import log, drafts and pending confirmations first. Preserve the source and response. Follow the reported retry instructions; if the outcome remains unclear, contact support before altering the source or sending it again.
- 400: configuration is missing or the text body is empty. Plugin errors generally contain an
errorstring. Correct the request or site setup first. - 401 or 403: authentication or permission was refused. WordPress normally returns
code,messageanddata.status. Verify the target site and secret without exposing them in logs. - 500 or 502: extraction, draft creation or the subscription request failed. Read the error and inspect WordPress before retrying. A service limit can surface through this wrapper; underlying service status codes are not guaranteed to pass through.
- Other responses can come from the host, firewall or WordPress security plugins. Keep the status and a sanitized response for diagnosis.
File integrations
For a person submitting files, use Upload Flyer or the optional private upload page. Subscription mode accepts PNG, JPEG, WebP and native PDFs up to 4 MiB. Text-based .docx files use extracted document text, subject to the text limit; embedded images are not the document's text source. The plugin's default decoded upload cap is 10 MiB, and your host can impose a smaller request limit.
An authorized file automation can use the separately enabled WordPress route POST /wp-json/calendardrop/v1/upload-flyer. Configure the correct REST URL for your WordPress permalink settings. The Private Upload URL shown in settings opens the human upload page; it is not the REST target. The file route has a different header, X-CalendarDrop-Upload-Secret, and uses the private upload link's secret, not the text webhook secret. Keep that secret in the integration's credential store. Send JSON string fields file_data (base64 file bytes or a base64 data URI), file_name and file_type (MIME type). This is not a multipart upload. Send the complete original file, not a first-page preview as a substitute for a PDF. Base64 increases the request size.
The private upload route defaults to 20 requests per hour per IP-based bucket; site configuration can change that limit. This limit does not describe the text webhook. Its success response includes success: true and the import result; errors generally return HTTP 400 with an error message. Authentication and host-level errors can differ. Apply the same draft, partial-failure and retry checks as above.
Permission and data handling
Submit only material you have permission to process. Keep unrelated correspondence, confidential records and secrets out of event source text. An agent should not choose a destination site, connect a paid account, or start chargeable imports beyond its owner's authorization.
In subscription mode, the selected source passes through CalendarDrop to Google Gemini for extraction. WordPress stores drafts and may retain uploads and import logs. CalendarDrop retains extracted results for recovery and separate account, billing and usage records. Own-provider mode sends extraction requests to the provider configured in WordPress. Read the data-use details for retention and provider handling.
For help, email josh@pennerstrategy.com with the CalendarDrop and WordPress versions, request time, status and a sanitized error. Do not send authentication values or confidential source documents. Back to CalendarDrop.