B2B tools with a self-serve plan
A React app lets small teams buy a seat pack in the app. Sales sees paid sign-ups as HubSpot contacts and follows up on the larger ones.

Checkout embed
React opens the checkout, Plandalf takes payment, and the paid user becomes a HubSpot contact through a webhook step.
No credit card required. No coding required.
React
HubSpotPlandalf has no native HubSpot steps, and React code does not write to HubSpot for you. The app opens the checkout; after payment a Send Webhook step calls HubSpot's contacts API or a function you host. A HubSpot workflow can post to a Plandalf catch URL to start a promo countdown.
| Event | From and to | Through | What happens |
|---|---|---|---|
| Checkout opened | React → Plandalf | A component renders data-plandalf-present for a modal, or data-plandalf-mount for an inline checkout in a stable container. | |
| Checkout completed | Plandalf → HubSpot | Webhook | Send Webhook posts to /crm/v3/objects/contacts/batch/upsert, matching on email, with a private app token in the Authorization header. |
| Invoice paid | Plandalf → HubSpot | Webhook | Renewals fire this trigger as well, which suits a second webhook that updates a custom contact property. |
| Workflow sends a webhook | HubSpot → Plandalf | Webhook | A HubSpot workflow action posts contact properties to a Plandalf Webhook Trigger URL, where email is read as the participant. |
| Marketing email countdown | Plandalf → HubSpot | By hand | A countdown image tag goes in an HTML module, with HubSpot's contact email token as the ref. |
HubSpot calls a private app token a Bearer token. Treat it like a password.
Use a JSX button with data-plandalf-present and a stable container with data-plandalf-mount for inline checkout. Under React Strict Mode prefer an effect that calls sdk.mount() and returns handle.close().
Give it the contact write scope, copy its access token and keep that token in Plandalf's step headers or a server function, never in React.
In Automation, My Sequences choose Plandalf, Checkout Completed and your offer. Pick a real checkout on the Test tab so {{trigger.customer_email}} and {{trigger.customer_name}} have values.
Method POST, URL set to HubSpot's batch upsert for contacts, Authorization: Bearer with your token, and a JSON payload with one input whose id is the email, idProperty is email and properties carry the name.
Run the test with your own email and open the contact in HubSpot. Then add a refund sequence if a property such as lifecycle stage should change.
A React app lets small teams buy a seat pack in the app. Sales sees paid sign-ups as HubSpot contacts and follows up on the larger ones.
Each paid booking creates a contact with a course property, and a HubSpot workflow sends the joining instructions.
Checked October 26, 2026 against Plandalf's own setup guides and the vendor documentation: HubSpot CRM API: contacts, HubSpot private apps overview, HubSpot: use webhooks with workflows.