Free WordPress plugin for Laposta

Your Laposta signup forms, on your own site.

Wynko connects WordPress to your Laposta account, then gets out of the way. You get two things you can drop anywhere on your site: signup forms built from your real Laposta lists, and a block that lists the newsletters you’ve sent. No embed codes. No iframes. Your site, your styling.

WordPress 6.4+ · PHP 8.0+ · GPLv2, free on WordPress.org

A Wynko signup form rendered on a WordPress page using the Astra theme, showing email, first name and last name fields with a Subscribe button
The same Wynko signup form rendered on the Kadence theme, styled entirely by the theme
The Wynko form editor in wp-admin, listing the fields pulled from a Laposta list
The block editor showing a Wynko Campaigns block listing recently sent Laposta campaigns as dated links
The Wynko settings page in wp-admin, showing API connection status and cache duration
A Wynko form on the Astra theme — no extra CSS written

Built from your live list

Fields, options and required flags always match Laposta.

Styled by your theme

Minimal structural CSS. Your theme does the rest.

Spam stopped at the door

Honeypot, rate limiting, full server-side re-validation.

Your API key, treated properly

Verified on entry, encrypted at rest, or kept out of the database.

What you actually get

Two blocks. That’s the whole plugin.

Wynko doesn’t try to be a form builder, a CRM, or a marketing suite. It connects one WordPress site to one Laposta account and gives you two things to place on your pages.

The Wynko form editor in wp-admin, listing the fields pulled from a Laposta list

A signup form that can’t drift out of sync

Pick a Laposta list, and Wynko builds the form from that list’s own field definitions — required fields, dropdown options, all of it.

Change the list in Laposta and the form follows. If a cached copy ever briefly lags, one failed attempt triggers an automatic resync, so the very next attempt uses Laposta’s current fields.

  • Unlimited forms, each built from its own Laposta list’s fields, labels and options
  • Full HTML5 field support — help text, defaults, length limits, patterns, browser autofill
  • Every value re-validated server-side against those same rules
  • Show label, placeholder, both, or neither — and drag fields into any order
  • Customize success and failure messages, redirect or hide the form after signup, with an optional terms checkbox
  • “Already subscribed” reads the same as success, so the form can’t be used to test list membership
  • Optional bridges subscribe visitors from Contact Form 7 and HTML Forms too — and any plugin can add its own
  • Signup counts per form, right in wp-admin
  • Minimal structural CSS, tunable via custom properties, plus a shortcode for classic themes: [wynko_form id="N"]
The block editor showing a Wynko Campaigns block listing recently sent Laposta campaigns as dated links

A newsletter archive that keeps itself current

Drop in the Wynko: Campaigns block and it lists your most recently sent Laposta campaigns, each one linked.

There’s no front-end CSS here at all — your theme styles it completely.

  • Choose how many latest campaigns to show
  • Filter by list, or show all of them
  • Order by date sent, subject, or campaign name — newest or oldest first
  • Label shows subject, date, campaign name, or a combination
  • Cached 60 minutes by default
  • Refresh manually whenever you want it sooner

Why not just use the embed code

Because an iframe is someone else’s page inside yours.

Laposta gives you an embeddable form, and it works. But an embedded form is a separate document loaded into your page. It brings its own styling, it doesn’t inherit your theme, it’s awkward to make responsive, and it doesn’t know anything about the rest of your site.

Wynko renders the form as ordinary HTML in your page. Your theme styles it. Your CSS reaches it. Your page speed isn’t waiting on a third-party frame. And because the field definitions are read from Laposta rather than copied by hand, the form still can’t drift out of sync with your list.

Embedded formHand-built formWynko
Inherits your theme and CSSNoYesYes
Fields stay in sync with LapostaYesNoYes
Subscribe from forms built in other pluginsNoPartialYes
Server-side validation on your siten/aPartialYes
Field-level validation (length, pattern, range)PartialPartialYes
Browser autofill hintsPartialPartialYes
Spam protection (honeypot, rate limiting)PartialPartialYes
Extendable with code (hooks & filters)NoPartialYes
  • Yes, built in
  • Depends on you or Laposta
  • No

How it works

Three steps, then it runs itself.

  1. 01

    Connect your Laposta account

    Paste your API key into Wynko → Settings, or define it as a constant in wp-config.php. Wynko checks the key with Laposta before saving anything, so a wrong key is caught immediately instead of failing quietly later.

  2. 02

    Place your form or block

    Choose a list and build your form under Wynko → Signup forms, then place it with the form block or the shortcode. Add the campaigns block to any post or page.

  3. 03

    Leave it alone

    Campaigns stay cached and refresh on their own. Signups are validated, rate-limited and logged to an activity log with info, warning and error entries. On an error, Wynko can email you about it automatically.

For agencies and developers

Built to be deployed, not clicked through.

Your Laposta API key is the key to your entire mailing list. Wynko is built on that assumption.

wp-config.php

The safest setup, and the one we recommend, is one line in wp-config.php:

define( 'WYNKO_API_KEY', 'your-laposta-api-key' );

A key defined this way never enters your database, so it can’t leak through a backup, a stray export, or a database-level breach. If a constant is set, it always wins — Wynko won’t let a saved value quietly shadow it. On multisite, suffix the blog ID (WYNKO_API_KEY_3) to give one site its own key.

Where the sodium PHP extension is available and your site has real WordPress security salts, the key is sealed with authenticated encryption before it’s written to the database. A raw database export or a SQL-injection read doesn’t hand over a usable key.

This protects the database on its own. It does not protect against someone who can also read wp-config.php, because your salts live there too. If you rotate SECURE_AUTH_KEY, previously sealed keys become unreadable by design, and the settings screen tells you exactly that rather than sending garbage to Laposta.

If your server has no sodium extension, or you’re still running WordPress’s placeholder salts, the key is stored as plain text and the settings screen says so plainly.

Not just the key. Cache duration, log level, rate-limit window and caps, and error alerts can all be set from an environment variable or a wp-config.php constant. Environment variables outrank constants, constants outrank the settings screen, and each tab shows which one is in charge so it’s never ambiguous where a value came from.

That means staging and production carry their own configuration with your deployment, instead of someone remembering to click through a settings screen on every site.

All eight variables
  • WYNKO_API_KEY
  • WYNKO_CACHE_MINUTES
  • WYNKO_LOG_LEVEL
  • WYNKO_THROTTLE_WINDOW
  • WYNKO_THROTTLE_IP_MAX
  • WYNKO_THROTTLE_FORM_MAX
  • WYNKO_NOTIFY_ENABLED
  • WYNKO_NOTIFY_EMAILS

By default one visitor can submit 15 signups and one form can accept 400, within any rolling 10-minute window. All three numbers are adjustable, and there’s a “Reset signup limits” button if a limit ever locks out real visitors before you’ve had a chance to raise it.

The per-visitor cap is the one to raise if a shared office, school or NAT gateway sends real traffic from a single address. The per-form cap is a backstop, not a first line of defence — keep it well above your real traffic.

The activity log records key checks, connection checks, syncs and signups at whatever level of detail you set. It never contains your API key, and signup entries never contain anyone’s email address or answers. Filter it on screen or download it as a .txt to attach to a support request.

There’s a system report too — a health check of WordPress, PHP, your database, PHP modules and your server, each flagged against what Wynko is tested with. It warns you about anything unusual and never blocks you.

Every site in the network has its own settings, its own Laposta account, its own log and its own alerts on its own hourly limit. Uninstalling cleans up after itself across the whole network.

Every outgoing API call, campaign fetch, form submission and log entry fires a wynko_* action or filter. Add a header to every Laposta request, pull the API key from your own secrets manager, or forward error-level log entries into your own alerting stack — no core edits.

add_filter( 'wynko_api_key', fn( $key ) => my_secrets_manager()->get( 'laposta_key' ) ?: $key );

See the full reference in the hooks and filters docs.

Wynko ships bridges for Contact Form 7 and HTML Forms — off until an admin switches them on under Wynko → Integrations. The same registry is open to your own code: implement Wynko\Integrations\Integration, add it to the wynko_register_integrations filter, and your bridge appears on that screen with its own settings, version and docs link.

add_filter( 'wynko_register_integrations', fn( $list ) => [ ...$list, new My_Wynko_Integration() ] );

Your integration writes to Laposta through Wynko\Api\Subscribers::create(), reusing Wynko’s key resolution and transport. See Integrations for the full contract and a getting-started walkthrough.

Open source. Development happens in the open at github.com/FlexBorder/wynko. Issues and pull requests are welcome.

Questions

Frequently asked

Where do I find my Laposta API key?

Laposta documents it in their help centre. Paste the key into Wynko → Settings — the plugin makes a live request to verify it before storing anything, so an invalid key is rejected on the spot.

Is it free?

Yes. Wynko is free to download and use from the WordPress plugin directory, licensed GPLv2, with its source code public on GitHub. Every feature described here is included — nothing is held back behind a paywall or a trial.

How many signup forms can I have?

As many as you need. Wynko → Signup forms lists every form on the site, with an “Add form” button to create another. Each form is bound to its own Laposta list and has its own settings, so different forms on the same site can feed different lists.

Can I style the forms to match my theme?

Yes, and that’s the point. Wynko ships only the minimum layout CSS and leaves colours, fonts and spacing to your theme. CSS custom properties are available if you want more control. The campaigns block ships no front-end CSS at all.

Can visitors subscribe through a form I built in another plugin?

Yes. Wynko ships optional bridges for Contact Form 7 and HTML Forms — switch one on under Wynko → Integrations, add a checkbox to your existing form, and accepted submissions are subscribed to the Laposta list you choose. The bridge system is open, so any plugin or theme can add support for another form plugin. See Integrations.

What does Wynko store about my visitors?

Nothing beyond what it passes to Laposta. Signups aren’t saved on your site. The activity log notes that a form was submitted, whether it worked, and which form it was — never the email address or anything the visitor typed. When a visitor submits a form, their field values, IP address and referring URL are sent to Laposta so the subscriber can be added to your list. Nothing else is sent, and nothing is sent unless someone actually submits.

Will it slow my site down?

No. Both campaign data and a form’s field definitions are cached for 60 minutes by default, so a page isn’t calling Laposta on every view. You can change the cache duration or refresh manually.

What happens if I change a field in Laposta?

The form’s cached copy can briefly lag behind. Wynko doesn’t wait for the cache to expire on its own: the first submission that fails against the stale definitions triggers an immediate resync with Laposta, and the visitor’s next attempt is validated against the current fields. A form can only drift out of sync for one failed attempt before it corrects itself.

How does Wynko stop spam?

Several layers, all before anything reaches Laposta: a hidden honeypot field, rate limiting per visitor and per form over a rolling window, full server-side validation against your list’s real field definitions, and a security token scoped to each form. A forged token, an unknown form and a rate-limited request all get identical responses, so a script probing the endpoint can’t learn which check it failed.

Does it work on multisite?

Yes. Every site keeps its own settings, connects to its own Laposta account, keeps its own log, and sends its own alerts on its own hourly limit.

Can I keep the API key out of the database?

Yes, and it’s the recommended setup. Define WYNKO_API_KEY in wp-config.php or set it as an environment variable — either always wins over a stored value. On multisite, suffix the blog ID (WYNKO_API_KEY_3) to give one site its own key. Because it isn’t in the database, uninstalling Wynko won’t remove it; delete the line yourself when you’re done.

Is this an official Laposta plugin?

No. Wynko is developed independently by FlexBorder Co., Ltd and is not affiliated with or endorsed by Laposta. Laposta is a trademark of its respective owner.

Can I customize how Wynko behaves with code?

Yes. Wynko fires WordPress action and filter hooks — all prefixed wynko_ — at every meaningful point: outgoing API requests, campaign data, form submissions, and log entries. See Hooks and filters for the full reference.

Ready to get started?

Install Wynko from the WordPress plugin directory and connect your Laposta account in about five minutes.

Requires WordPress 6.4 or later and PHP 8.0 or later · GPLv2 ·Source on GitHub