Trello is one of the simplest project management tools and its API is one of the most straightforward to call. Yet CF7 to Trello integrations fail constantly, usually for the same handful of reasons that are never clearly documented anywhere.
This post covers every cause of CF7 submissions not creating Trello cards, with direct API calls you can use to verify each piece before connecting your form.
Cause 1: API Key and Token Confusion
Trello uses a two-part authentication system that trips up most developers on first setup.
You need two separate values:
-
API Key: Found at
trello.com/power-ups/adminafter creating a Power-Up. This is your application identifier. - API Token: Generated separately by authorising your Power-Up to access your Trello account. This is the user-level access grant.
The API Key alone cannot make API calls. The Token alone cannot make API calls. Both are required on every request.
The correct API call format is:
https://api.trello.com/1/cards?key=YOUR_API_KEY&token=YOUR_TOKEN
Or as headers:
curl -X POST "https://api.trello.com/1/cards" \
-H "Accept: application/json" \
-d "key=YOUR_API_KEY" \
-d "token=YOUR_TOKEN" \
-d "idList=YOUR_LIST_ID" \
-d "name=Test Card from CF7" \
-d "desc=This is a test submission"
If either value is missing or swapped, Trello returns invalid key or invalid token.
How to generate a token: After generating your API Key, go to:
https://trello.com/1/authorize?expiration=never&scope=read,write&response_type=token&name=CF7+Integration&key=YOUR_API_KEY
Replace YOUR_API_KEY with your actual key. Authorise and copy the token from the resulting page.
Cause 2: Using Board ID Instead of List ID
Cards in Trello are created inside Lists, not inside Boards. The API endpoint for creating a card requires a List ID (idList), not a Board ID.
Board IDs and List IDs look identical — both are 24-character alphanumeric strings. This is where most configuration errors happen. The plugin asks for a List ID. The user looks up their Board URL, copies the Board ID, and pastes it in. The API returns invalid id or creates nothing.
Find your List ID:
# Get all lists on a board
curl "https://api.trello.com/1/boards/YOUR_BOARD_ID/lists?key=YOUR_API_KEY&token=YOUR_TOKEN"
Each list in the response has an id field. That 24-character string is what goes in the idList parameter when creating a card.
Find your Board ID from the board URL: trello.com/b/BOARD_ID/board-name. The short code after /b/ is not the full ID. To get the full Board ID:
curl "https://api.trello.com/1/members/me/boards?key=YOUR_API_KEY&token=YOUR_TOKEN&fields=id,name"
Cause 3: The Card Description Can Only Hold One Mapped Field in Free Plugins
Unlike ClickUp which has custom fields, Trello cards have a limited structure: Name, Description, Labels, Due Date, and Members. Most CF7 to Trello integrations map form data to the card Name and Description.
The Description field in Trello accepts plain text or Markdown. If your form has multiple fields (name, email, phone, message), you need to concatenate them into a single Description string.
Many free CF7 Trello plugins only allow mapping one CF7 field to the Description. If you have a form with five fields, four of them go nowhere. The card is created with just the name and one field value.
The correct approach when using the Trello API directly is to build the description as a multi-line string:
{
"idList": "YOUR_LIST_ID",
"name": "Enquiry from [your-name]",
"desc": "**Name:** [your-name]\n**Email:** [your-email]\n**Phone:** [your-phone]\n**Message:** [your-message]"
}
Trello renders Markdown in card descriptions, so **Name:** renders as bold in the Trello UI.
Cause 4: Token Expired or Insufficient Scope
When generating the Trello token, you choose an expiration and scope. If the expiration was set to 30 days and it has now been more than 30 days since setup, the token has expired. Every API call returns invalid token.
The scope must include write to create cards. A token generated with scope=read can fetch board and list data but cannot create, update, or delete anything.
Always generate tokens with:
-
expiration=neverfor server integrations scope=read,write
If your existing token has expired or has read-only scope, generate a new one using the URL in Cause 1 above.
Connecting CF7 to Trello Directly
Trello's card creation API is genuinely one of the simplest in the project management space. You do not need a dedicated plugin. Contact Form to API handles the POST request from the WordPress dashboard.
Configure:
-
Endpoint:
https://api.trello.com/1/cards - Method: POST
- Body:
{
"key": "YOUR_API_KEY",
"token": "YOUR_TOKEN",
"idList": "YOUR_LIST_ID",
"name": "Enquiry from [your-name]",
"desc": "**Email:** [your-email]\n**Phone:** [your-phone]\n**Message:** [your-message]"
}
Every CF7 field in brackets gets replaced with the actual submitted value before the request is sent. The response log shows you whether Trello created the card and what the card ID is.
Quick Diagnosis
# 1. Test your API key and token
curl "https://api.trello.com/1/members/me?key=YOUR_KEY&token=YOUR_TOKEN"
# Expect: your Trello user object
# "invalid key" = API key wrong
# "invalid token" = token wrong, expired, or wrong scope
# 2. Get your board's lists to find List IDs
curl "https://api.trello.com/1/boards/YOUR_BOARD_ID/lists?key=YOUR_KEY&token=YOUR_TOKEN"
# 3. Create a test card
curl -X POST "https://api.trello.com/1/cards?key=YOUR_KEY&token=YOUR_TOKEN&idList=YOUR_LIST_ID&name=Test+Card"
# Expect: card object with "id" field
# "invalid id" = wrong List ID (possibly using Board ID instead)
| Symptom | Cause | Fix |
|---|---|---|
invalid key |
Wrong API key | Get key from trello.com/power-ups/admin
|
invalid token |
Token wrong, expired, or read-only | Regenerate with expiration=never&scope=read,write
|
invalid id on card creation |
Board ID used instead of List ID | Fetch lists from board, use the list id
|
| Card created but only has name | Free plugin limitation on description | Use direct API with multi-field description string |
| Cards stopped being created | Token expired | Check token age, regenerate if past expiration |
Top comments (0)