Before you ship, confirm the app passes the FDK and behaves correctly in Freshdesk. Then pack and upload it for review.
Validate
From the app root:
fdk validateFix all reported platform and lint issues. Common gotchas:
- manifest.json must reference files that actually exist under app/ (index.html, ticketSidebar.html, icon paths).
- platform-version is 3.0 and modules/locations match the placement rules: full_page_app under common, ticket_sidebar under support_ticket for Freshdesk.
- Every template name in config/requests.json is also declared under modules.common.requests in manifest.json. Names must match exactly.
Run locally and configure iparams
fdk runThen do the following:
- Open http://localhost:10001/system_settings and subscribe to common and support_ticket with your Freshdesk account URL.
- Open http://localhost:10001/custom_configs and save a real Freshdesk domain and API key.
- Open Freshdesk with ?dev=true (or &dev=true if there are existing query params).
Manual test checklist
| Surface | What to do | What you should see |
|---|---|---|
| Full page | Apps launcher → your app | Ticket CRUD UI loads; Recent tickets list loads from your Freshdesk |
| Full page (create) | Fill subject/email/description → Create ticket | New ticket appears in Freshdesk’s native ticket list and refreshes in the app |
| Full page (delete) | Paste a ticket id → Delete | Ticket disappears from the list (moved to trash in Freshdesk) |
| Ticket sidebar | Open an existing ticket with ?dev=true | Sidebar shows #id, subject, status, and priority |
| Ticket sidebar (status) | Click Open / Pending / Resolved / Closed | Ticket property widget updates; toast confirms |
| Ticket sidebar (priority) | Click Low / Medium / High / Urgent | Ticket property widget updates; toast confirms |
If the sidebar is blank, confirm ticketSidebar.html includes <script src="{{{appclient}}}"></script>, app.initialized() runs without errors, and the page you opened actually has ticket context (the ticket list view doesn’t).
Common failure modes
| Symptom | Likely cause |
|---|---|
| window.app is undefined | HTML entry missing <script src="{{{appclient}}}"></script> |
| 401 Unauthorized from a template | freshdeskApi iparam blank or wrong; re-save at /custom_configs |
| Template <name> not found | Listed in config/requests.json but not declared in manifest.json under modules.common.requests |
| Sidebar loads the full-page UI | ticketSidebar.html is importing the full-page entry file instead of a dedicated sidebar entry |
Pack the app
When all checks pass, produce the submission artifact:
fdk packFDK writes a packaged zip to dist/<app-name>.zip at the app root. That zip is what you upload. It includes only the files the platform needs and excludes node_modules/, logs, and anything listed under fdkExcludeFiles in package.json.
Upload to the marketplace
- Sign in to the Freshworks Developer Portal.
- Create a new app (or a new version of an existing app).
- Upload dist/<app-name>.zip.
- Fill in listing details (icon, screenshots, description, support email, installation instructions) then submit for review.
Review usually takes a few business days. The reviewer validates the app end-to-end on a clean Freshdesk account, so make sure the iparams page clearly explains what domain and API key format you expect.
Keep goingSee App submission process and Rate limits and constraints for the full reviewer checklist and runtime limits.