Configure Functions
Let a Fetchply agent call a public GET or POST endpoint for live data with encrypted authentication and controlled responses.
Functions are custom endpoints the agent can call during chat. Free supports none; Starter supports 1, Pro 5, and Business 20.
Ready-made integrations
When you add a function you can start from a ready-made integration instead of building one field by field. Pick a card, paste your credentials, fill in the one or two account details it asks for, and the tool is ready:
- Zendesk — Create support ticket: when the agent can't resolve an issue, it collects the visitor's name, email, a subject, and the details, then files a Zendesk ticket. Your team follows up by email. You'll need your Zendesk subdomain (the first part of
https://<subdomain>.zendesk.com) and an API token, entered as[email protected]/token:YOUR_API_TOKEN. - Freshdesk — Create support ticket: the same flow for Freshdesk. You'll need your Freshdesk subdomain and your API key, entered as
YOUR_API_KEY:X(the letter X stands in for the unused password). - Stripe billing: the agent answers "is my subscription active", "when do I renew", and "did my payment go through" from your Stripe account. The visitor gives their billing email; the agent looks up the account and reports subscription status, the renewal date, and the latest invoice's payment status and amount due — never names, addresses, or payment details. When the visitor wants to make a change — cancel, switch plans, update their card, or pay an open invoice — the agent sends them to your Stripe customer portal sign-in page, where Stripe emails them a secure sign-in link before letting them in. You'll need two things from Stripe: a restricted API key (Stripe Dashboard → Developers → API keys → Create restricted key) with read access to Customers, Subscriptions, and Invoices only, and your customer portal login link (Settings → Billing → Customer portal → activate the login link).
- Cal.com scheduling and Calendly scheduling: let the agent offer open time slots and book meetings.
New tickets are created as open with low priority; your team re-prioritizes them in the helpdesk. To protect your customers' privacy, the agent can create tickets but cannot read existing ones, so ticket follow-ups happen over email rather than in the chat.
Because Stripe billing answers are looked up by the email a visitor claims, anyone who knows a billing email can ask about that account. Only enable it if subscription status and invoice amounts are acceptable to share on that basis; the tools never reveal anything more. Account changes are safer: they always go through your Stripe customer portal, which verifies the visitor owns the email before any change can be made.
Troubleshooting ready-made integrations
- The test returns 401: the credentials are wrong, revoked, or entered in the wrong format. For Zendesk, check that the entry includes
/tokenafter your email and that token access is enabled in Admin Center → Apps and integrations → APIs. For Freshdesk, check that the entry ends with:X. - Stripe returns 403: your restricted key is missing a permission. Edit the key in the Stripe Dashboard and grant Read access to Customers, Subscriptions, and Invoices.
- Stripe finds no account for an email that exists: the match is exact, including capitalization. The agent automatically retries in lowercase; if the email is stored in Stripe with unusual capitalization, ask the customer for the exact address on their receipt. When one email has several billing accounts, the newest one is used.
- The Stripe portal link doesn't work for visitors: the customer portal login link must be activated in Stripe under Settings → Billing → Customer portal. If you deactivate or regenerate it there, edit the Stripe functions and paste the new link.
- The test can't reach the address: double-check the subdomain. Enter only the first part of your helpdesk address (for
https://acme.zendesk.com, enteracme), not the full URL. - A ticket didn't appear: run the built-in test from the function's edit screen, then check Activity for the exact error returned by your helpdesk.
Describe the function
Open Integrations → Functions. Add a clear name, description, and Call when guidance so the agent knows when the endpoint is appropriate.
Configure the request
Choose GET or POST and enter a public HTTPS URL on port 443. GET sends parameters in the query string; POST sends a JSON body.
If your API expects a value inside the address itself — for example /orders/12345 — write the address with a placeholder: https://api.example.com/orders/{{param:order_id}}. At call time the placeholder is replaced with the visitor's value for the parameter of the same name. A parameter used this way must exist in your parameters list and be marked required; its value is inserted safely, so it can never change which site or page the request goes to. Placeholders work in the path and in query values, but not in the domain.
Define inputs and authentication
Add text, number, or true/false parameters. Use no auth, a bearer token, Basic auth (entered as username:password), or a named API-key header. Stored secrets are encrypted and are not shown again.
Shape the response
Send the full response to the agent or map fields into a response template. Keep the returned data small and safe for a visitor-facing answer.
Test and monitor
Run the built-in test, enable the function, then trigger it in chat. Review Activity for calls and failures.
Private IPs, localhost, non-HTTPS URLs, redirects, and non-443 ports are rejected. Responses are capped at 32 KB, and the timeout you set must be between 10 and 30 seconds. Functions already saved with a shorter timeout keep working; the next time you edit one, raise it to at least 10 seconds before saving.
A function failure returns a structured result so the agent can respond without blindly replaying a non-idempotent request. Design POST endpoints to be safe against retries anyway.
If chat replies mention that a required value for the request was missing, the function's address contains a placeholder like {{param:order_id}} and the agent called it without that value. The agent asks the visitor for it and tries again on its own; if it keeps happening, make the parameter's description clearly state what to collect from the visitor.